2010-03-05 6 views
5

Wenn ich versuche, einen String in einen numerischen Wert mit Parse oder TryParse oder Convert.ChangeType zu konvertieren, kann ich nicht de Tausendertrennzeichen verwalten, wie es im System definiert ist:String Numerische Konvertierung und Gruppenseparator

wenn ich ein:

var d = double.Parse("1,234", CultureInfo.CurrentUICulture); 

es nicht 1234.

zurückkehrt wenn ich die Gruppe Separator verwendet werden soll, muss ich eingeben:

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture); 

Dieses Mal ist das Ergebnis, dass man erwartet.

Aber ich möchte nicht die Verwendung der tausend Trennzeichen erzwingen, ich möchte es nur verwenden, wenn das System es in den Globalisierungseinstellungen angeben. Gibt es eine Möglichkeit zu wissen, ob das Trennzeichen verwendet wird (ich weiß, dass ich die Gruppe Separator in CultureInfo.CurrentUICulture.NumberFormat.NumberGroupSeparator lesen kann)

Prost Loic

Antwort

0

Sie immer die zweite Zeile Sie

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture); 
verwenden verwenden könnte

, da es sowohl 1234 als auch 1,234 korrekt konvertiert und 1,234 auf Systemen mit '.' als Gruppentrenn

+0

Ja, aber in Wirklichkeit möchte ich die Convert.ChangeType-Funktion verwenden, um eine generische Zeichenfolge zu einem numerischen Konverter zu machen und sie als String-Erweiterung bereitzustellen. Aber Convert.ChangeType hat keine Überladung mit NumberStyles-Parameter. Es erlaubt nur einen IFormatProvider-Parameter. Und was ich nicht verstehe, ist, warum die Defaut-Einstellung für Parse nicht meinen internationalen Systemeinstellungen entspricht, wo die Verwendung von Gruppen-Trennzeichen eingestellt ist. – Loic

2

Mit Number nicht Nachfrage ein Komma (, die AllowThousands enthält) - es ist einfach erlaubt es. So könnten Sie Number mit oder ohne das Komma verwenden. Oder verwenden Sie Any oder AllowThousands.

Beachten Sie, dass "Komma" mit "Tausendertrennzeichen" austauschbar ist - d. H. Bei einigen von Eurupe kann es variieren (Zeitraum usw.). Wenn Sie bedeuten "Komma ist Tausende" dann verwenden Sie eine feste Kultur (wie InvariantCulture).

+0

Ich bin damit einverstanden. Aber mein Problem ist (behaupten, dass Kultur ist 'fr-FR' und tausend Trennzeichen ist ein Leerzeichen), warum: Die folgende Zeile funktioniert: double d = (double) Convert.ChangeType ("1 234", typeof (doppelt), _kultur); Während die folgende Zeile eine Formatausnahme auslöst? int i = (int) Konvertieren.ChangeType ("1 234", typeof (int), _kultur); – Loic

0

Sie sollten Benutzereingaben unter Verwendung von CurrentCulture und nicht CurrentUICulture analysieren. Die Eigenschaft CurrentUICulture bezieht sich auf die Sprache, in der die Benutzeroberfläche angezeigt wird, und CurrentCulture auf die in Windows angegebene aktuelle Ländereinstellung. Auf diese Weise kann ein Benutzer, der mit einer Anwendung arbeitet, die eine auf Englisch übersetzte Benutzeroberfläche bereitstellt (CurrentUICulture), beispielsweise Daten und Zahlen anzeigen, die als Gebietsschema formatiert sind, das er in Windows festgelegt hat (CurrentCulture).

+0

Hallo, danke für Ihre Hilfe. Meine Anwendung ermöglicht dem Benutzer, die Sprache als Laufzeit zu ändern (wir bieten 7 verschiedene Sprachen). Wir ändern die CurrentUICulture und die CurrentCulture, wenn der Benutzer eine Sprache auswählt. Wir möchten, dass der Benutzer Daten und Zahlen als ausgewählte Sprache anzeigt und eingibt, und nicht als Gebietsschema, das im System eingestellt ist. – Loic