[Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Gizor

Mitglied
Dabei seit
21.08.10
Beiträge
470
Standort
Niederwil - Schweiz
Trophäen
!
#1
Hallo Ihr lieben und fleissigen Scripter

Einige Scripts haben in der Schweiz Probleme.
Die stürtzen nämlich bei uns ab, respektive laufen nicht.

Dies hat anscheinend damit zu tun, dass wir ein anderes Zahlenformat haben.

Das sieht so aus: 100'000'000.50 und bei euch 100,000,000.50 (glaube ich) :)

Dies müsste also von euch berücksichtigt werden.
Erspart uns armen Scheizern viel Sorgen und Suchereien.

Vielen herzlichen Dank an alle.
 

m.s

FF-Team
Mitarbeiter
Dabei seit
19.09.02
Beiträge
11.275
#2
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Danke für den Hinweis. Könntest du diese Skripte hier auflisten, wenn sie dir auffallen?
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#3
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo René,

Du hast das amerikanische Format erwischt. Bei uns ist es #.##0,##

Die Zahlen werden normalerweise ohne 1000er Unterteilung ausgegeben. Daher entspricht Deine Schreibweise meist dem amerikanischen Grundformat.
Wenn im selben Land gelesen/geschrieben wird, spielt es normalerweise keine Rolle. Eine Rolle spielt es bei Parametern, die vorgegeben sind und dann nicht mehr gelesen werden können.
Leider gibt es keine länderunabhängige Version zum Parsen und Ausgeben von Zahlen wie VB (VAL oder STR)oder VB.Net (Ausgabe über Ländercode z. B. "en-us")
 

Gizor

Mitglied
Dabei seit
21.08.10
Beiträge
470
Standort
Niederwil - Schweiz
Trophäen
!
#4
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Aha OK Werner. Der Knackpunkt ist ja glaube ich nur unser Dezimalpunkt oder?
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#5
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

So ist es. Es sei denn, man gibt explizit das erweiterte Zahlenformat aus. Dann sind's auch die Tausendertrennzeichen.
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#6
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo,

habe mal 2 so Funktionen mit der heißen Nadel gestrickt:
Code:
[COLOR="Green"]'Konvertiert amerikanische Zahlen[/COLOR]
[COLOR="Blue"]Option Explicit

Public Function VAL(sZahl) [COLOR="Green"]'As Double[/COLOR]

	Dim aZahl
	aZahl = Split(Replace(Replace(sZahl, " ",""), ",", ""), ".")

	Select Case UBound(aZahl, 1)
		Case -1
			VAL = 0
		Case 0
			VAL = CDbl(aZahl(0))
		Case 1
			If Len(aZahl(0)) = 0 Then aZahl(0) = "0"
			If Len(aZahl(1)) = 0 Then aZahl(1) = "0"

			VAL = CInt(aZahl(0)) + (CInt(aZahl(1)) / (10 ^ Len(aZahl(1))))
		Case Else
			Dim i
			Dim lUBound
			lUBound = UBound(aZahl, 1)
			sZahl = ""
			For i = 0 To lUBound - 1
				sZahl = sZahl & aZahl(i)
			Next
			Val = Cint(sZahl) + (CInt(aZahl(lUBound)) / (10 ^ Len(aZahl(lUBound))))
	End Select
End Function

Public Function STR(dZahl) [COLOR="Green"]'As String[/COLOR]
	STR = Replace(CStr(dZahl), ",", ".")
End Function[/COLOR]
Wofür sollte man die Funktionen verwenden?:
Schreiben/Lesen von Zahlen, die als Parameter verwendet werden, z. B. in INI-Dateien.
Für das Konvertieren von Benutzereingaben sollten weiterhin CDbl und CStr verwendet werden.

Beispiele:
dZahl = VAL("25,255.5") => 25255,5
sZahl = STR(25255.50) => "25255.5"


Vorgehensweise:
- Zeichen wird berücksichtigt
Es werden alle Lehrzeichen entfernt.

Folgende Fehler treten auf:
  • Wenn alles gut geht, sollte "Case Else" nie erreicht werden. Ist noch drin für das Parsen von internationalen Zahlen, das ich aber ausgebaut habe. Es trat dabei ein Fehler auf, wenn eine Zahl nur Tausendertrennzeichen ohne Dezimaltrennzeichen enthielt.
  • Ist ein anderes Zeichen als eine Zahl zwischen den Trennzeichen, gibt es, anders als beim echten VAL einen Fehler

Nachtrag: Andere Methode
Man kann VAL ähnlich STR auch über WMI, ggf. sogar über Registry lösen. Dazu muss das Dezimalzeichen ermittelt werden und via Replace dahin konvertiert werden. Dann kann man CDbl verwenden. Dazu muss man das Trennzeichen entweder abspeichern oder (nicht empfohlen) stetig neu ermitteln (Zeitfaktor)
 
Zuletzt bearbeitet:

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.813
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#7
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo Werner,
ein interessanter Beitrag, den Du unbedingt in die Skript-Wiki eintragen solltest.
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#8
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo Harald,

kannst Du gerne übernehmen. Müsste erst mal mein Passwort wieder suchen.
 

Mecki14

Mitglied
Dabei seit
15.03.06
Beiträge
2.813
Standort
Düsseldorf
Trophäen
einige {*} {!} * !
#9
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Ab sofort in der Wiki zu finden unter Zahlenformat.
 

praetor

Mitglied
Dabei seit
24.10.04
Beiträge
2.144
Standort
Berlin
Trophäen
{**!!!}**!!!!! !!!!! !!
#10
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Ab sofort in der Wiki zu finden unter Zahlenformat.
Das hängt ja damit zusammen und sollte im Wiki vielleicht verknüpft werden.
Das Problem ist m.E. auch gar nicht so sehr, Zahlenschema A nach Schema B zu konvertieren, sondern rauszubekommen, welche Schemata im konkreten Fall die richtigen sind.
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#11
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo Andreas,

es geht einfacher (Plaudern wir mal aus dem Nähkästchen):

Ermittle die Werte aus der Registry

Lese einmal ein, speichere die Daten zum schnellen Zugriff und Du hast die Möglichkeit schnell zu handeln. Man kann nämlich in jedem Land die Werte individuell ändern!

Das Beispiel ist aber nicht gedacht Werte zwischen Länder zu transformieren, sondern landunabhängig Dezimalwerte zu speichern, wobei im Schnellschuss evtl. 10er Potenzen(!) nicht berücksichtigt sind. Mit den Werten aus der Registry ließe sich das jedoch leicht ändern.

Etwa so:

CDbl(Replace(Replace(Replace(sZahl, ",", Chr(0)), ".", sDecimal), Chr(0), sThousand))

Also so:
Code:
[COLOR="Green"]'Konvertiert amerikanische Zahlen[/COLOR]
[COLOR="Blue"]Option Explicit

Dim mv_Thousand
Dim mv_Decimal

MsgBox VAL("-2.25E-15")

Public Sub InitialCountryValues()
	mv_Decimal = RegRead("HKEY_CURRENT_USER\Control Panel\International", "sDecimal")
	mv_Thousand = RegRead("HKEY_CURRENT_USER\Control Panel\International", "sThousand")
End Sub

Public Function RegRead(sPfad, sKey) [COLOR="Green"]'As String[/COLOR]
	Dim sReturn
	Dim oShell
	RegRead = ""
	On Error Resume Next
		Set oShell = CreateObject("WScript.Shell")
		sReturn = oShell.RegRead(sPfad & "\" & sKey)
		If Err.Number = 0 Then RegRead = sReturn
		Err.Clear
		Set oShell = Nothing
	On Error Goto 0
End Function

Public Function VAL(sZahl) [COLOR="Green"]'As Double[/COLOR]
	If Len(mv_Decimal) = 0 Then InitialCountryValues
	VAL = CDbl(Replace(Replace(Replace(sZahl, ",", Chr(0)), ".", mv_Decimal), Chr(0), mv_Thousand))
End Function

Public Function STR(dZahl) [COLOR="Green"]'As String[/COLOR]
	If Len(mv_Decimal) = 0 Then InitialCountryValues
	STR = Replace(CStr(dZahl), mv_Decimal, ".")
End Function[/COLOR]
Zu beachten ist, dass der Zugriff auf WScript.Shell zugelassen sein muss. Sonst muss man auf eine alternative Registry-Methode zugreifen, z. B. via WMI. Darum ist das Lesen aus der Registry gekapselt und der Rest der Funktion gelöscht, um keine Verwirrung aufkommen zu lassen.
 

praetor

Mitglied
Dabei seit
24.10.04
Beiträge
2.144
Standort
Berlin
Trophäen
{**!!!}**!!!!! !!!!! !!
#12
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo Werner,
aus dem “Nähkastchen” ist immer gut :)

Interessant finde ich den Ansatz, die maßgeblichen Dezimal- und Tausender-Trenner aus der Registry zu ermitteln. Das ist universeller als über das Gebietsschema (GetLocal).
Die Konvertierung funktioniert ja aber leider nur für amerikanische bzw. analog aufgebaute Zahlen. Da wäre eine generischer Ansatz natürlich schöner. Allerdings ist mir jetzt auch nichts Schlaues eingefallen, weil die Routine ja z.B. nicht wissen kann, ob mit „572.149“ Fünfhun-derzzweiundsiebzigtausendeinhundertneunundvierzig gemeint ist oder stattdessen Fünfhunderzzweiundsiebzig Komma Eins Vier Neun. Wäre die Anzahl der Nachkommastellen bekannt, ließe sich natürlich was machen …
 

W.P.

Mitglied
Dabei seit
16.10.02
Beiträge
5.099
Standort
Anzing BY
#13
AW: [Hinweis] Probleme mit dem schweizer Zahlenformat in Skripten

Hallo Andreas,

eigentlich können die beiden Funktionen alles, was gefehlt hat, nämlich das Konvertieren von und nach String zu Double in einem unabhängigem Zahlenformat. Mehr ist schlicht nicht nötig.

Lokale Konvertierungen konnte VBScript und JScript im Gegensatz zu anderen BASIC-Dialekten schon immer: CDbl, CSng und CStr! Diese sollten für Benutzereingaben verwendet werden, während VAL und STR für Speicheroperationen (Datei, Registry, Übergabe von Parametern) verwendet werden sollten.

Du kannst jedoch eine unabhängige Version nachbilden, da mit CStr keine Tausender-Trennzeichen generiert werden. Dies kann nämlich nur FormatNumber! Es reicht, einfach von/nach die Kommas und Punkte nach dem lokalen Dezimaltrennzeichen zu konvertieren (Replace) und die lokalisierten Übersetzungsmechanismen anzuwenden. Das erste Beispiel ist ursprünglich dazu gedacht gewesen, wäre nicht ein so fataler Bug drin bei Zahlen wie 20.233 (Deutsches Format). Sonst wäre der Else-Zweig nie entstanden.

Ach ja: Wenn man das Ganze noch auf die Spitze treiben möchte, kann man noch eine Klasse daraus bauen und vielleicht noch weitere Konvertierungen einbauen. Z. B. für das Datumsformat, geografische Koordinaten, Bruchzahlen(Hier wäre eine eigene Klasse angebracht ;) ) etc. Schade, dass VBScript keine Shared-Member kennt.
 
Oben