2017-04-18 3 views
0

Ich habe einen Dezimalwert 14780 in En-US-Gebietsschema, die erwartete Ausgabe in Deutsch ist 14.780. Aber die nachlaufende Null nimmt nicht.Dezimale Konvertierung Lokalisierung

Decimal.Parse (string.Format ("{0: n0}", 14780), System.Globalization.CultureInfo.InvariantCulture)

beobachteten Ausgabe: 14,78

Antwort

0
  1. System.Globalization.CultureInfo.InvariantCulture ist nicht die gleiche als German (de-DE). Beim Parsen und Konvertieren in eine Zeichenfolge wird immer dieselbe Kultur verwendet, indem diese Kultur in den Methoden Parse/TryParse und Format angegeben wird. Die Verwendung von Englisch (invariant) für eins und Deutsch für das andere führt zu unerwarteten Ergebnissen, da das Dezimal- und das Komma eine entgegengesetzte Bedeutung zwischen den Kulturen haben. Nimm niemals an, dass der Thread die Kultur liefert, wenn du nicht weißt, was diese Kultur ist und sie kann nicht geändert werden.
  2. Eine abschließende 0 würde nie von der linken Seite des Dezimaltrennzeichens fallen gelassen werden, außer Sie verwenden wissenschaftliche Notation, in welchem ​​Fall sie auch dann erhalten bleibt, aber einen Exponenten benutzt. Vielleicht haben Sie Ihre Frage nicht richtig eingegeben und beziehen sich auf die rechte Seite (Bruchteil) der Zahl?

Codebeispiel:

var value = 14780M; 
var strValue = string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:n0}", value) 
// strValue is equal to "14.780" 

Hier ist der Code oben zeigt, dass es funktioniert, wenn die gleiche Kultur verwenden, aber Pausen, wenn Sie Kulturen mischen.

// OK - using InvariantCulture for both 
var culture = System.Globalization.CultureInfo.InvariantCulture; 
Console.WriteLine(Decimal.Parse(string.Format(culture, "{0:n0}", 14780), culture)); 

// OK - using de-DE for both 
culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); 
Console.WriteLine(Decimal.Parse(string.Format(culture, "{0:n0}", 14780), culture)); 

// FAIL - mixing de-DE and InvariantCulture 
culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); 
Console.WriteLine(Decimal.Parse(string.Format(culture, "{0:n0}", 14780), System.Globalization.CultureInfo.InvariantCulture)); 

Siehe Fiddle

0

decimal Typ nicht Tausende seperators speichern. Aber Sie können sie wieder rekonstituieren, wenn Sie das Dezimal zurück in eine Zeichenfolge konvertieren.

decimal deci = Decimal.Parse(string.Format("{0:n0}", 14780), System.Globalization.CultureInfo.InvariantCulture); // 14780 
string str = string.Format("{0:n0}", deci); // 14.780 

.NET String.Format() to add commas in thousands place for a number.

.net Fiddle