2016-10-07 2 views
0

Ich versuche, aus einer XML-Datei einen Wert von sagen wir 2,25 als Dezimaltrennzeichen durch "," getrennt zu analysieren.Convert.ToDecimal wirft System.FormatExcept

decimal hrsElapsed = Convert.ToDecimal(caseNode["hrsElapsed"].InnerText, new NumberFormatInfo() {NumberDecimalSeparator = ","}) 

Allerdings bekomme ich eine System.FormatException. Die gleiche Codezeile, die auf andere Felder angewendet wird, wirft sie nicht. Zum Beispiel hier:

decimal hrsOrigEst = Convert.ToDecimal(caseNode["hrsOrigEst"].InnerText, new NumberFormatInfo() {NumberDecimalSeparator = ","}); 

überprüfte ich, um zu sehen, was der tatsächliche Wert von caseNode[""].InnerText der „2,25“ so sehe ich keinen Grund, warum ich ein Format Exception bekommen würde. Irgendwelche Ideen?

+0

2.25 verwendet Punkt als Trennzeichen, aber in Ihrer NumberFormatInfo haben Sie Koma als Trennzeichen gesetzt. –

Antwort

3

Ein Dezimaltrennzeichen hat kein implizites Dezimaltrennzeichen, das ein String haben könnte, wenn Sie das Dezimalzeichen in eins umwandeln. Sie benötigen also eine NumberFormatInfo/CultureInfo, die einen Punkt als Dezimaltrennzeichen verwendet, um die Zeichenfolge zu decimal zu analysieren, z. CultureInfo.InvariantCulture:

decimal hrsElapsed = decimal.Parse(caseNode["hrsElapsed"].InnerText, CultureInfo.InvariantCulture); 

Jetzt müssen Sie ein NumberFormatInfo/CultureInfo, die für decimal.ToString Komma als Dezimalzeichen verwendet:

string hrsElapsedWithComma = hrsElapsed.ToString(new CultureInfo("de-DE")); // or another one that uses comma as decimal separator 
0

Die NumberFormatInfo gibt dem Konverter Hinweise, wie die Zeichenfolge caseNode["hrsElapsed"] in eine Dezimalzahl konvertiert werden kann. Weil Ihre Zeichenfolge ein "." und kein Komma, das es nicht analysieren kann.

Der Datentyp decimal hat kein Konzept der Dezimaltrennzeichen, nur die String-Darstellung davon.

Versuchen Sie, die NumberDecimalSeperator zu entfernen, und wenn Sie Ihre Dezimalzahl zurück in eine Zeichenfolge konvertieren, verwenden Sie sie stattdessen dort.

0

Der decimal Typ ist ein numerischer Typ, er hat keine Formatierung selbst. Es gibt also in C# keine "Dezimaltrennzeichen getrennt durch", "". Es gibt Dezimalzahlen, und es gibt Zeichenketten, die durch Formatieren der Dezimalzahl erzeugt werden.

Das Format, das Sie an Convert.ToDecimal liefern, ist das Format, mit dem die Zeichenfolge in eine Dezimalzahl konvertiert wird. Da die Zeichenfolge, die Sie konvertieren, einen Punkt verwendet, sollten Sie diesen in Ihrem Format verwenden.

Um dann diese Dezimalzahl in eine Darstellung mit einem Komma zu konvertieren, konvertieren Sie sie in eine Zeichenfolge mit einem geeigneten Format.

 decimal hrsElapsed = Convert.ToDecimal("2.5", new NumberFormatInfo() {NumberDecimalSeparator = "."}); 
     string representationWithComma = hrsElapsed.ToString(new NumberFormatInfo() {NumberDecimalSeparator = ","});