2014-01-23 8 views
10

Wenn ich ein Doppel zu einem String und zurück zu einem Doppel, die genau übereinstimmt, konvertieren wollte würde ich so etwas wie:Produzieren einen Round-Trip-String für einen Dezimal-Typen

double d1 = 1/3.0; 
string s = d1.ToString("R"); 
double d2 = double.Parse(s); 

Aber das "R" Format ist nicht für einen dezimalen Typ definiert (Sie erhalten eine "FormatException: Formatspezifizierer war ungültig").

Wie wird eine Round-Trip-Zeichenfolge für einen Dezimaltyp erzeugt?

+0

Der Code ist gültig C#, und (für das angegebene Beispiel, mindestens) funktioniert wie vorgesehen/beschrieben. Ich weiß nicht, ob der Code da ist, was @musefan gesehen hat. –

+0

@TimS .: Eigentlich habe ich das ganze 'double' /' decimal'-Ding vermisst ... mein bad – musefan

+1

Das String-Format einer Dezimalzahl ist bereits der exakte Wert der Dezimalzahl. ** Das ist der Punkt des Dezimals **. –

Antwort

10

Das Standardausgabeformat für decimal Round-Trips, so dass Sie nichts Besonderes tun müssen. Es ist genau wie int in diesem Sinne.

+0

Welche Konvertierungsmethode müsste man verwenden, um aus einer Zeichenkette eine Dezimalzahl zu erzeugen, um sicherzustellen, dass "1.20" 1.20m und nicht 1.2m ergibt? – supercat

+0

@supercat: Sie würden 'decimal.Parse (" 1.20 ")' verwenden, um 1.20m zurückzubekommen - wenn Sie 'double.Parse (" 1.20 ")' verwenden, erhalten Sie 1.2d zurück. – Gabe

+0

Ich war verwirrt, weil die VB.NET-Direktmodus-Druckfunktion [die ich verwendet habe, um das Verhalten einfacher .NET-Methoden zu testen] die abschließenden Nullen aus irgendeinem Grund abschneidet; Hinzufügen von '.ToString()' das behoben. – supercat

3

Decimal in der Tat ein binär Dezimalwert (es verwendet Basis von , nicht wie in Double) und deshalb wie ToString("R") auf besondere genaue Darstellungen gibt es keine Notwendigkeit;

Decimal value = 123.456m; 
    String result = value.ToString(CultureInfo.InvariantCulture); // <- That's enough 

Siehe auch für weitere Details:

http://csharpindepth.com/articles/general/decimal.aspx

1

Wenn Sie versuchen,

decimal d1 = 1m/3; 
string s = d1.ToString(); 
decimal d2 = decimal.Parse(s); 
// where d1 == d2 = true 

Sie werden sehen, Sie keine zusätzliche Formatierungsoptionen benötigen eine richtige string Darstellung zu erhalten.

Verwandte Themen