2014-04-17 17 views
16

Ich schreibe eine benutzerdefinierte Zeichenfolge zu Decimal Validator, die Decimal.TryParse verwenden muss, die Kultur ignoriert (dh es ist egal, ob die Eingabe "." Oder "," als Dezimalpunkt enthält) Separator). Dies ist die vorgeschlagene Methode:Culture Invariant Decimal.TryParse()

public static bool TryParse(
    string s, 
    NumberStyles style, 
    IFormatProvider provider, 
    out decimal result 
) 

ich nicht herausfinden kann, was als dritten Parameter zu verwenden. Die Beispiele, die ich gesehen habe, sehen so aus:

so erstellen sie eine bestimmte Kultur. CultureInfo hat keine "CreateInvariantCulture" -Methode, und CultureInfo.InvariantCulture hat nicht den erforderlichen Typ. Was ist die richtige Verwendung?

Antwort

28

haben wie diese versuchen:

decimal value; 
bool b = Decimal.TryParse("0.1", NumberStyles.Any, new CultureInfo("en-US"), out value); 

Der beste Weg wäre wahrscheinlich die Decimal.Parse() Methode, wie Sie es traditionell mit irgendwelchen Dezimalstring Werte zu verwenden.

Sie NumberStyles.Currency können Sie festlegen, dass die Werte als Währung eingelesen werden, die Versorgung aller währungsbezogenen Werte annehmen wird (Sie müssen einen Verweis auf System.Globalalization hinzuzufügen, diese verwenden:

using System.Globalization; 

Decimal.Parse akzeptiert auch einen dritten Parameter, die Sie ausdrücklich erlaubt, die IFormatProvider einstellen, wenn Sie so wählen und eine bestimmte Kultur zu Ihnen wünschen:

decimal value = Decimal.Parse(currency, NumberStyles.Currency, CultureInfo.InvariantCulture); //yields 15.55 
1

In der Tat CultureInfo.InvariantCulture können hier verwendet werden. Der Parameter erfahre cts IFormatProvider, eine Schnittstelle, die CultureInfo implementiert. Aber InvariantCulture ist invariant in dem Sinne, dass es nicht mit den Benutzereinstellungen variiert.

In der Tat gibt es keine Kultur, die entweder , oder . als Dezimaltrennzeichen akzeptiert - sie sind alle der eine oder andere. Sie müssen eine andere Möglichkeit finden, um mit Daten umzugehen, die eines dieser Dezimaltrennzeichen verwenden können.

1

Ich kann nicht herausfinden, was als der 3. Parameter zu verwenden ist.

Da alle Kulturen NumberDecimalSeparator oder NumberGroupSeparator etc .. sind nicht das Gleiche.

Someones verwendet . als NumberDecimalSeparator, jemand verwendet , aber es gibt keine CultureInfo, der sowohl als NumberDecimalSeparator verwendet.

CultureInfo implementiert IFormatProvider Schnittstelle. Deshalb, wenn Sie Ihre CultureInfo angeben, versuchen Sie, Ihre value Zeichenfolge auf diesen Kulturen Regeln zu analysieren.

Ich schreibe eine benutzerdefinierte Zeichenfolge zu Dezimal-Validator, die Dezimal verwenden muss.TryParse dass Kultur

In einem solchen Fall ignoriert, können Sie CultureInfo.Clone method Verwendung von kopieren, die Kultur, die Sie wollen (oder InvariantCulture) und Sie können NumberDecimalSeparator und NumberGroupSeparator gesetzt, die Zeichenfolge, die Sie wollen.

5

Meine bösen Jungs. Ich habe den folgenden Code getestet:

 string DutchDecimal = "1,5"; 
     string EnglishDecimal = "1.5"; 
     decimal a; 
     decimal b; 
     Console.WriteLine(decimal.TryParse(DutchDecimal, out a)); 
     Console.WriteLine(a); 
     Console.WriteLine(decimal.TryParse(EnglishDecimal, out b)); 
     Console.WriteLine(b); 
     Console.Read(); 

und es analysiert beide Zeichenfolgen korrekt. Sieht so aus, als ob der Standard TryParse tatsächlich kulturinvariant ist. Ich nahm an, dass dies nicht der Fall war, da der standardmäßige TypeConversionValidator in EnterpriseLibrary kulturabhängig war und ich annahm, dass er einfach TryParse verwendete. Es stellt sich jedoch heraus, dass dieser Standardparser hardcoded ist, um die aktuelle Kultur zu verwenden.

EDIT: Ich fand heraus, dass „1.5“ wandelt auf 1,5 und „1,5“ wandelt auf 15. Diese für Kultur invariante Verhalten tatsächlich richtig ist, so gibt es sie. Diese ganze Frage entstand offenbar durch mein Missverständnis darüber, wie kulturinvariant funktioniert.

+0

aus der [Microsoft Dokumentation] (https://msdn.microsoft.com/en-us/library/9zbda557 (v = vs.110) .aspx) sieht es aus wie .NET auf Ihre lokalen Systemeinstellungen schaltet sich, wenn Sie nicht angeben, eine Kultur: 'Parameter s analysiert wird, um die Formatierungsinformationen in einem Number-Objekt für das aktuelle System culture.' initialisiert –

+0

Parsing 1,5 bis 15 nicht wirklich richtig ist, ist es? Wenn ',' ein Tausendertrennzeichen ist, sollte es an der Position 10 nicht erlaubt sein. Ich denke, Parsing 1,5 mit Culture Invariant Parsing sollte fehlschlagen. –