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 =====