version=1.4.0 vdate=14.011.2016 fname=cast_todblgeneric.bas ns=%NAMESPACE% fpath=/vba/cast {{keywords>vba,cast,double,number}} {{description>Dies ist eine flexible Cast-Funktion um Strings mit verschiedenen Anordnungen von Tausender- und Dezimaltrennzeichen in ein Double zu wandeln. V-%%version%%}} ====== [VBA] toDoubleGeneric() ====== //Dies ist eine flexible Cast-Funktion um Strings mit verschiedenen Anordnungen von Tausender- und Dezimaltrennzeichen in ein Double zu wandeln. // ==Version %%version%% - %%vdate%%== {{%%fname%%|Download %%fname%% (V-%%version%%)}} Bei mir waren das vor allem Export aus SAP, die im folgenden Format vorlagen: ''1.234.567,89-'' \\ In einem anderen File lag dann die Zahl wieder so vor: ''-1'234'567.89'' \\ Diese Funktion erkennt beide Formate. Im Gegensatz zu [[.:strtodouble]] werden in dieser Funktion die Trennzeichen nicht definiert. Siehe dazu auch den [[#vergleich_mit_anderen_cast-funktionen_fuer_double|Vergleich mit anderen Cast-Funktionen für Double]]. ===== Definition ===== Public Function toDblGeneric( _ Optional ByVal iNumberV As Variant = Null, _ Optional ByVal iDelemiterHandling As tngDelemiterHandling = tngDecimal _ ) As Double ==== Parameterliste ==== ***//iNumberV//** String oder Nummer, welche gecasted werden soll ***//iDelemiterHandling//** tngDelemiterHandling handelt das verhalten beim Speziealfall 1.234 ==== Enumerator ==== === tngDelemiterHandling === Dieser Enumerator regelt das Verhalten, wenn nicht klar ist ob es sich beim einzigen Trennzeichenfund um ein Dezimal- oder Tausendertrennzeichen handelt. \\ Zum Beispiel die Zahl ''1,234''. Das kann jetzt ''1'234'' oder ''1.234'' bedeuten. Public Enum tngDelemiterHandling tngDecimal = 0 tngThousend = 1 End Enum ***tngDecimal** Beim Trennzeichen handelt es sich um ein Dezimaltrennzeichen (Standard) ***tngThousend** Beim Trennzeichen handelt es sich um ein Tausendertrennzeichen ==== Rückgabewert ==== Die Zahl als Double ==== Errors ==== *Wenn iNumberV nicht geparst werden kann, wird ein Error 13 (Type missmatch) geworfen. *Wenn die Zahl Tausnedertrennziechen aber keine Nachkommastellen hat, kommt ein falsches Resultat. Siehe Anwendungsbeispiele ===== Anwendungsbeispiele ====== Hier einige Anwendungsbeispiele > Für die Ausgabe der Resultate verwendete ich die Funktion [[:vba:functions:print_r:]]. 'Eine ganze normale Zahl print_r toDblGeneric("1234567.89") 1234567.89 'Mit Tausendertrennzeichen print_r toDblGeneric("-1'234'567.89") -1234567.89 'In meinem idiotischen Forma aus SAP print_r toDblGeneric("1.234.567,89-") -1234567.89 'Zahl mit Nachkommastellen, jedoch ohne Nachkommastelle print_r toDblGeneric("1'234.00") 1234 'die Erste Zahl aus einem Text extrahieren print_r toDblGeneric("Total-Summe: -1'234'567.89€ bei Anzahlung in 12 Raten") -1234567.89 'Hat man Tausendertrennzeichen und keine Nachkommastellen, dann gibt die Funktion den Wert falsch aus. 'Leider kann da die Funktion nicht herausfinden ob das Komma ein Dezimal oder Tausendertrennzeichen ist. print_r toDblGeneric("1,234") 1.234 'Mann kann das übersteuern print_r toDblGeneric("1,234", tngThousend) 1234 'Wenn aber die Bedinungen für den Sonderfall nicht gegebnsind, dann wird trotz tngThousend normal gerechnet print_r toDblGeneric("1,2345", tngThousend) 1.2345 print_r toDblGeneric("1234,567", tngThousend) 1234.567 print_r toDblGeneric("1,234,567", tngDecimal) 1234567 'Mit dem E-Faktor print_r toDblGeneric("2.3 e2") 230 ===== Vergleich mit anderen Cast-Funktionen für Double ===== {{section>:vba:compairetodoublefunctions#Vergleichstabelle&noheader&firstseconly}} ===== Code =====