Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Str vs Replace

Begonnen von Beaker s.a., Januar 05, 2016, 13:25:17

⏪ vorheriges - nächstes ⏩

Beaker s.a.

Hallo Franz,
Da im anderen Thread doch eher OT hier.
ZitatReplace()-Funktion:  Warum einfach, wenn's auch kompliziert geht?   ;)  Wenn die Str-Funktion nicht geht, geht auch die Replace-Funktion nicht....
Da mir nicht bewusst war, dass Str Komma in Punkt umwandelt habe ich mir die OH zu Str angeschaut, und bin etwas verwirrt.
ZitatDas erforderliche Argument Zahl ist ein Wert vom Typ Long, der einen beliebigen numerischen Ausdruck enthält.
.
.
.
Die Str-Funktion erkennt nur den Punkt (.) als zulässiges Dezimalzeichen.
Nun ergaben meine Tests aber Folgendes:
?Str(10.33)
10.33
?Str(10,33)
Ergibt Fehlermeldung: Falsche Anzahl von Argumenten ...

Leuchtet ein.
?Str("10,33")
10.33

Widerspricht IMO o.a. Zitat bezügl. Datentyp des Arguments, liefert aber das richtige Ergebnis.
Übersehe ich da was?
btw. Str("10.33") ergibt 1033
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Josef P.

Hallo!

Zitatein Wert vom Typ Long
Da ist vermutlich ein Fehler in der Hilfe. Long glaube ich nicht. Da sollte eher numerischer Ausdruck bzw. Double stehen.

zu str("10.33"):
Bei String-Übergabe wird vermutlich der Text zuvor zu eine Zahl konvertiert.
Prinzip: str(cdbl("10.33"))

mfg
Josef

DF6GL

Hallo,


naja,  Programmieren nach MS-Hilfe ist so wie Autofahren mit Blick (nur) auf's  Navi..  ;)

Die Aussage bzgl. des Argumententyps (besonderer Blödsinn ist "Long") basiert vielleicht noch auf uraltem Code aus Basic-Zeiten und es wurde übersehen, das anzupassen. Ich nehme an, VBA6(7) konvertiert ein String-Argument erst in eine numerische Zahl (unter Berücksichtigung der Regionseinstellungen bzgl. Dezimal-Trennzeichen) und dann wieder zurück in einen (Ziffern-) String mit einem Dezimal-Punkt an passender Stelle.

Jedenfalls erfüllt Str() die korrekte Konvertierung einer internen numerischen Zahl in eine Ziffern-Folge (String) mit passenden Vorzeichen und Dezimal-PUNKT (US-Darstellung einer Dezimalzahl) , so wie es in SQL-Zuweisungen oder auch VBA-Recordset-Feldzuweisungen erforderlich ist.


Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

MzKlMu

Hallo,
mit VBA kannst Du das nicht prüfen, da in VBA es kein Komma als Dezimaltrenner gibt, das ist immer der Punkt. In einer Abfrage (oder in Formularen als berechnetes Feld) geht das. Siehe Bild.
Gruß Klaus

Beaker s.a.

Hallo,
@Josef
ZitatBei String-Übergabe wird vermutlich der Text zuvor zu eine Zahl konvertiert.
Prinzip: str(cdbl("10.33"))
Aber das wäre dann doch eine ZAHL im korrekten (amerikanischen) Format; - ?

@Klaus
Hast Du es ausprobiert? Wenn ich da bei Zahl 10.33 einsetze erhalte ich im Feld String auch 1033, - und nu?
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

#5
Hallo,
natürlich habe ich das ausprobiert. Kannst Du doch im Bild sehen.
Du darfst da auch nicht 10.33 übergeben, sondern 10,33.
Du willst doch das Komma weg haben, was soll es da für einen Sinn machen 10.33 zu übergeben. In einer deutschen Version ist 10.33 ja gar nicht möglich.
Und wenn Du es trotzdem eingibst wird auch bei der Zahl aus der 10.33 > 1033 weil das mit dem deutschen Punkt als Tausendertrennzeichen kollidiert und die Str Funktion macht daraus richtigerweise 1033.
Gruß Klaus

Josef P.

#6
ZitatAber das wäre dann doch eine ZAHL im korrekten (amerikanischen) Format; - ?
Nein, das ist ein Text. ;)
Diesen konvertiert z. B. CDbl gemäß Lädereinstellung in eine Zahl. Ich nehme an, dass innerhalb Str das auch (bzw. durch implizite Konvertierung) passiert.

Str erwartet einen numerischen Datentyp. Wird statt diesem ein String übergeben, kommt es vermutlich zu einen programmierten oder impliziten Konvertierung.

Prinzip:
Dim x As Double
x = "10.33"
Debug.Print x, Str(x), CStr(x)
   
x = "10,33"
Debug.Print x, Str(x), CStr(x)


mfg
Josef

Beaker s.a.

Hallo,
@Klaus
Zitatnatürlich habe ich das ausprobiert. Kannst Du doch im Bild sehen.
Ich seh da nur Kommas.
ZitatDu darfst da auch nicht 10.33 übergeben, sondern 10,33.
Es ging ursprünglich auch nicht darum was ich darf (oder ob ich das mache), sondern um das für mich seltsame Ergebnis beim Testen der Str-Funktion.
Zitatweil das mit dem deutschen Punkt als Tausendertrennzeichen kollidiert und die Str Funktion macht daraus richtigerweise 1033.
Kann ich akzeptieren, aber als Nichtmathematiker + - ITler nicht verstehen (Position des .)

@Josef
???
Erst schreibst Du es wird in eine Zahl konvertiert, und dann ist die Text?
Ich habe es so verstanden, dass zuerst "10.33" in eine Zahl gewandelt wird und dann erst CDbl und Str angewendet werden. Das würde doch bedeuten, dass der Ausdruck NACH der Konvertierung so aussehen würde: str(cdbl(10.33)). Und das, nur die 10.33 meine ich, ist doch eine Zahl mit amerik. Dezimalzeichen, oder nicht?
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

#8
Hallo,
ZitatIch seh da nur Kommas.
wo siehst Du da nur Kommas ?
Lade das Bild herunter und schaue es Dir vergrößert an. In der Spalte "string" steht ein Punkt. Vielleicht hilft ja auch eine Brille.  :P
Aber es ist eigentlich ganz einfach. 10.33 gibt es auf einer deutschen Oberfläche nicht als Zahl. Das ist schlichtweg ausgeschlossen. Daher taugt es auch nicht als Vergleich.

Im Anhang noch ein vergrößertes Bild
Gruß Klaus

Beaker s.a.

Hallo Klaus,
Zitatwo siehst Du da nur Kommas ?
In der Spalte "Zahl", da Argument von Str., um das es ja ursprünglich ging.
EOT
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MaggieMay

Hi,

wie gesagt ist es eine Länderspezifikation und in deutschsprachigen (und anderen europäischen) Ländern ist der Dezimalpunkt ein Komma. Eine Zeichenkette die sich wie "10.31" darstellt ist demnach keine Zahl, sondern ein Text.
Freundliche Grüße
MaggieMay

MzKlMu

Hallo,
ZitatIn der Spalte "Zahl",
das ist ja auch der Ausgangswert (die eigentliche deutsche Kommazahl). Die Spalte Zahl ist als Double in der Tabelle angelegt, und da geht ohnehin nur das Komma als Dezimaltrenner.  Zu betrachten ist also nur die Spalte "string".

Übrigens, die Aussage ich sehe da nur Kommas (ohne Bezug auf eine Spalte) ist da reichlich verwirrend, denn es sind deutlich Kommas und Punkte zu sehen.
Gruß Klaus

DF6GL

Hallo,

ich glaube. die ganze Verwirrung kommt daher, dass nicht zwischen der internen Darstellung einer Zahl (die ja nicht "lesbar" ist) und der visuellen Darstellung (die für den User relevant ist) dieser Zahl unterschieden wird.
Zitat
wo siehst Du da nur Kommas ?

Genau ums "Sehen" geht es....

Eine für den User lesbare Zahl ist IMMER ein String (eine Folge von Ziffern/Zeichen), der  auf einer Oberfläche (Papier, Monitor) erscheint.

SQL (der SQL-Interpreter)  braucht ("sieht") eine Dezimalzahl in Darstellung mit Dezimal-Punkt, der Amerikanische User "sieht" gerne die gleiche Darstellung, und der deutsche Anwender mag am Liebsten das Komma als Dezimal-Zeichen.


Um nochmal auf die STR-Funktion zu kommen,  so liefert die einfach nur grundsätzlich die Dezimalpunkt-Darstellung einer Zahl, egal, ob bei deren Parameter eine (VBA-dargestellte, d. h. mit Punkt geschriebene) Dezimalzahl (und die ja auch nur als Text in den VBA-Editor geschrieben wird), ein Lateralstring (dann mit Berücksichtigung der Regionseinstellung)  oder eine Variable (dann sinnvollerweise von Datentyp Single/Double/Currency) angegeben wird. Voraussetzung in allen Fällen ist natürlich, dass eine "gültige" Zahl dahintersteckt.
Viele Grüße vom Bodensee
Franz, DF6GL

Hilfestellung:  http://www.access-o-mania.de/forum/index.php?topic=6969.msg118738#msg118738

Links und Tipps:
1.   http://v.hdm-stuttgart.de/~riekert/lehre/db-kelz/
1a. http://www.tinohempel.de/info/info/datenbank/normalisierung.htm
1b. https://support.office.com/de-de/article/Grundlagen-des-Datenbankentwurfs-eb2159cf-1e30-401a-8084-bd4f9c9ca1f5#bmterms
2.   http://www.donkarl.com
3.   https://web.archive.org/web/20201201233522/http://www.dbwiki.net/
4.   http://www.access-tutorial.de/
5.   http://www.tty1.net/smart-questions_de.htm
6.   http://access.joposol.com/accept

Last but not least:   < F1 > für Hilfe
;) Learning by doing not by spoon-feed ;)

Tipp: Find and Replace for Access

ebs17

Zitat...  und dann ist die Text?
Genau, denn eine SQL-Anweisung, die ja am Ende entsteht (oder Teile davon), ist ja nichts anderes als ein Text (Zeichenkette).

Eine Dezimalzahl (incl. Double, Single, Currency), die von außen kommt (aus Variable, Formularfeld, Arrayfeld) muss SQL-lesbar gewandelt werden. Dabei ist an der Stelle das Dezimaltrennzeichen schon der Punkt, siehe Hilfe:
ZitatDie Str-Funktion erkennt nur den Punkt (.) als zulässiges Dezimalzeichen.

Replace ist nicht wirklich ein Ersatz für Str, weil es eine dicke fette Funktion ist: Replace wurde mit VB6 (Acc2000) eingeführt. Hier wird gezeigt, wie man mit vielen Anweisungen mit herkömmlichen VB5-Befehlen eine deutlich schnellere Ersatzfunktion basteln kann im Vergleich zur originalen MS-Variante.
Sowie: Mit Textverarbeitung (Links, rechts, ersetzen) auf Zahlen loszugehen ist zwar oft möglich, hat aber mit aufwandsarmen Rechnen recht wenig zu tun und sind schon stilistisch unschön.
Auch zu heutiger Zeit basiert das ganze Computerunwesen auf 1 und 0, also Zahlen, und da sind im Sinne der Effizienz Zahlenrechnungen immer einer Textverarbeitung vorzuziehen.
Mit freundlichem Glück Auf!

Eberhard

MzKlMu

Hallo,
irgendwie ist das alles recht eigenartig.

Zitat von: Access VBA HilfeDie Str-Funktion erkennt nur den Punkt (.) als zulässiges Dezimalzeichen. Wenn die Möglichkeit zur Verwendung eines anderen Dezimalzeichens bestehen muß (zum Beispiel in internationalen Anwendungen), sollten Sie Zahlen mit der CStr-Funktion in eine Zeichenfolge umwandeln.

Dann aus dem Direktbereich:

?str(12.12)
12.12

?cstr(12.12)
12,12

?str(12,12)
Fehler

?cstr(12,12)
Fehler

Ich kann mir da auch keinen Reim darauf machen.
Gruß Klaus