version=2.0.0 vdate=15.09.2015 fname=cast_strtodouble.bas ns=%NAMESPACE% fpath=/vba/cast ====== [VBA] strToDouble() ====== //Funktion um einen String in ein Double zu wandeln unter angabe von Tasuender- und Dezimaltrennzeichen.// ==Version %%version%% - %%vdate%%== {{%%fname%%|Download %%fname%% (V-%%version%%)}} Manchmal bekommt man Zahlen als Text in den wirrsten Formaten. Mit der Funktion strToDouble kann ich die meisten dieser Formate in in ein Double umwandeln. Bei mir waren das vor allem Export aus SAP, die im folgenden Format vorlagen: ''1.234.567,89-'' Die meisten Variablen bleiben im Cache und werden nur überschrieben, wenn sie sich ändern. Somit muss nicht jedesmal alles durchgegangen werden. Das beschleunigt den Mehrfachaufruf zB. in einem Query Im Gegensatz zu [[.:todoublegeneric]] werden in dieser Funktion die Trennzeichen klar definiert. ===== Definition ===== Public Function strToDouble( _ ByVal iNumberS As String, _ Optional ByVal iThousandSeparator As Variant = Null, _ Optional ByVal iDecimalSeperator As Variant = Null, _ Optional ByVal iFlags As stdStrToDoubleFLags = stdSignRight + stdSignLeft _ ) As Double ==== Parameterliste ==== ***iNumberS** Die Zahl im Textformat ***//iThousandSeparator//** Tausendertrennzeichen. Wenn Null, dann das Trennezichen aus den Usersettungs des System ***//iDecimalSeperator//** Dezimaltrennzeichen. Wenn Null, dann das Trennezichen aus den Usersettungs des System ***//iFlags//** Flags: Position des Vorzeichens, Angabe ob es Dezimalstellen hat. Siehe den Enumerator stdStrToDoubleFLags ==== Enumerator ==== Für die Position des Vorzeichens, wird der folgende Enumerator verwendet Public Enum stdSignPosition stdNoSign = 2 ^ 0 'Die Zahl hat kein Vorzeichen oder schneidet es ab (analog zu abs()) stdSignLeft = 2 ^ 1 'Das Vorzeichen ist auf der linken Seite, falls vorhanen stdSignRight = 2 ^ 2 'Das Vorzeichen ist auf der rechten Seite, falls vorhanen stdNoCache = 2 ^ 3 'Funktion wird nicht mit gecachten Formaten verarbeitet End Enum ==== Rückgabewert ==== Die Zahl als Double ===== Anwendungsbeispiele ===== > Für die Ausgabe der Resultate verwendete ich die Funktion [[:vba:functions:print_r:]]. Hier einige Anwendungsbeispiele 'Mit User-Stnadarteinstellung des Systems print_r strToDouble("1'234'567.89") 1234567.89 print_r strToDouble("-1'234'567.89") -1234567.89 'Minuszeichen am Ende print_r strToDouble("1'234'567.89-") -1234567.89 'Mit einem Komma als Tausendertrennzeichen print_r strToDouble("1,234,567.89", ",") 1234567.89 'So wie ich die Daten aus SAP bekommen: Punkt als Tasuender-, Komma als Dezimaltrennzeichen 'und das Vorzeichen am Ende print_r strToDouble("1.234.567,89-", ".", ",", stdSignRight) -1234567.89 'Positives Vorzeichen am Ende print_r strToDouble("-1'234'567.89+") -1234567.89 'Da mein System den Punkt als Dezimaltrennzeichen hat, sind in diesem Beispiel 'beide Trennzeichen identisch. Es wir automatisch das letzte als Dezimaltrennzeichen 'gewertet print_r strToDouble("1.234.567.890", ".") 1234567.89 'Mit stdWithoutDecimal kann ich das übersteuern print_r strToDouble("1.234.567.890", ".", , stdWithoutDecimal) 1234567890 'Oder ich überschreibe das Dezimaltrennzeichen mit etwas anderem, dann ists auch klar print_r strToDouble("1.234.567.890", ".", ",") 1234567890 'Wenn ich auch noch vorzeichen habe, so muss ich das bei stdWithoutDecimal zusätzlich angeben print_r strToDouble("1.234.567.890-", ".", , stdWithoutDecimal + stdSignRight) -1234567890 'Die Zahl kann auch aus einem Text extrahiert werden print_r strToDouble("Saldo: 1'234'567.89- CHF") -1234567.89 print_r strToDouble("Saldo: -1.234.567,89 CHF", ".", ",") -1234567.89 ===== Vergleich mit anderen Cast-Funktionen für Double ===== {{section>:vba:compairetodoublefunctions#Vergleichstabelle&noheader&firstseconly}} ===== Code =====