Rechnen mit Kommazahlen (aus TextBox)

Hi, also ich hab nochmal ein wenig herumprobiert… Komischerweise, wenn ich bei den Regionalen Einstellungen meines Windows (XP Pro Deutsch) das Dezimaltrennzeichen auf „.“ stelle funktioniert es egal ob ich Punkt oder Komma verwende! Steht es auf „,“ will CDbl einen „,“-Wert… Komisch, oder?

Hallo,

Wenn ich die Zeile versuche, schreibt er mir nur ein Object
Required, scheint also nicht mit meinem VB6 zu funktionieren…
Aber ne universelle Lösung wär natürlich Top :wink:

ja, die kommt noch, ich war gestern Abend nur zu müde, um noch eine Zeile zu tippen und im Moment brennt hier die Luft. Ich habe noch für 10 Stunden Arbeit und noch fünf Stunden Zeit. :smile:

Das muss leider bis zum WE warten. Über die API (funktioniert außer in VBS immer) werden das ein paar Zeilen Code mehr.

Gruß Rainer

Hallo Peter!

Genau so ist es :frowning:
Gilt aber auch für andere Ländereinstellungen sinngemäss.

Na das ist ja ein ganz schöner Murks.
Schaut ganz nach Microsoft aus: „Gut gemeint, aber eigentlich unbrauchbar“

mfg
christoph

Hallo!

Dieses Thema hat mir seit gestern keine Ruhe gelassen. Folgende zwei Lösungsmöglichkeiten möchte ich auch noch präsentieren:

Überprüfen der CDbl-Funktion
Ist eine sehr unsaubere Methode. Würde ich nur, wenn wirklich nichts anders möglich, verwenden.

If CDbl(1.4) = 14 Then stWert = Replace(stWert, ".", ",")
dblWert = CDbl(stWert)

Verwenden der Val-Funktion
Eine Spur eleganter, da die Funktion Val() immer das amerikanische Dezimaltrennzeichen frisst, egal was im Betriebssystem eingestellt ist.

If InStr(stWert, ",") \> 0 Then stWert = Replace(stWert, ",", ".")
dblWert = Val(stWert)

mfg
christoph

1 Like

Hallo Christoph,

Dieses Thema hat mir seit gestern keine Ruhe gelassen.
Folgende zwei Lösungsmöglichkeiten möchte ich auch noch
präsentieren:

Überprüfen der CDbl-Funktion
Ist eine sehr unsaubere Methode. Würde ich nur, wenn wirklich
nichts anders möglich, verwenden.

If CDbl(1.4) = 14 Then stWert = Replace(stWert,
„.“, „,“)
dblWert = CDbl(stWert)

hmmm, geht … Aber ich gebe Dir Recht, behagt mir auch nicht so Recht.

Verwenden der Val-Funktion
Eine Spur eleganter, da die Funktion Val() immer das
amerikanische Dezimaltrennzeichen frisst,
egal was im Betriebssystem eingestellt ist.

If InStr(stWert, „,“) > 0 Then stWert =
Replace(stWert, „,“, „.“)
dblWert = Val(stWert)

Stimmt, das ist viel schöner. Da überlege ich doch, ob ich meine Lösung mit GetLocaleInfo() wirklich noch schreibe. Ein besseres Ergebnis bekomme ich damit auch nicht, nur ein paar Zeilen Code mehr.

Gruß Rainer

Hi Christoph,

If InStr(stWert, „,“) > 0 Then stWert = Replace(stWert, „,“, „.“)

wozu extra abfragen ob ein Komma drin ist?
dblWert = val(Replace(stWert, „,“, „.“))

LG Alex

Universallösung …
Hallo,

Wenn ich die Zeile versuche, schreibt er mir nur ein Object
Required, scheint also nicht mit meinem VB6 zu funktionieren…
Aber ne universelle Lösung wär natürlich Top :wink:

was ich vor hatte ist viel zu kompliziert und unnötig, ich lass es. :smile:

Sieh mal …

/t/rechnen-mit-kommazahlen-aus-textbox/4806258/26

Besser geht nicht.

Gruß Rainer

was ich vor hatte ist viel zu kompliziert und unnötig, ich
lass es. :smile:

Mist Mist Mist… hab ich das zu früh gepostet :wink:

LG Alex

Hi Alex,

was ich vor hatte ist viel zu kompliziert und unnötig, ich
lass es. :smile:

Mist Mist Mist… hab ich das zu früh gepostet :wink:

ja, wenn es denn noch interessiert …
Ich hab’s als Modul für VB6 gebaut, da ist das schön kompakt.

In der Form:

Option Explicit

Private Sub Command1\_Click()
 Label1.Caption = StrToDbl("12.34")
End Sub

Und das Modul:

Option Explicit

Private Declare Function GetSystemDefaultLCID Lib \_
 "kernel32" () As Long

Private Declare Function GetLocaleInfo Lib "kernel32" \_
 Alias "GetLocaleInfoA" (ByVal Locale As Long, \_
 ByVal LCType As Long, ByVal lpLCData As String, \_
 ByVal cchData As Long) As Long

Const LOCALE\_SDECIMAL = &HE

Public Function StrToDbl(ByVal Text As String) As Double
 Dim TZ As String
 Dim SZ As String
 TZ = GetEntry(LOCALE\_SDECIMAL)
 SZ = Chr(Asc(TZ) Xor 2)
 StrToDbl = CDbl(Replace(Text, SZ, TZ))
End Function

Private Function GetEntry(ID&amp:wink: As String
 Dim LCID&, Result&, Buffer$, Length&
 LCID = GetSystemDefaultLCID()
 Length = GetLocaleInfo(LCID, ID, Buffer, 0) - 1
 Buffer = Space(Length + 1)
 Result = GetLocaleInfo(LCID, ID, Buffer, Length)
 GetEntry = Left$(Buffer, Length)
End Function

Gruß Rainer

Hallo zusammen,

hier noch eine Version, bei der es völlig
egal ist, welches Trennzeichen als Komma
verwendet wird. Viel mir gerade ein, ist
zwar umständlich, dafür „schluckt“ sie
z.B. Eingaben wie
0,453435 1234#2323 .23 1273. 0ü123

LG Alex

Public Function fnStrToDbl(z As String) As Double
 Dim a, v, n As String
 Dim i As Integer

 v = z
 n = "0"
 For i = 1 To Len(z)
 a = Mid(z, i, 1)
 If a "9" Then
 v = "0" & Left(z, i - 1)
 n = Mid(z, i + 1) & "0"
 Exit For
 End If
 Next i

 fnStrToDbl = CDbl(CLng(v) + CLng(n) / 10 ^ Len(n))
End Function