2009-08-21 12 views
0

MSDN bietet ein Ziffer Platzhalter Beispiel:
1234.5678 ("#####") -> 1235
Ich fand diese verwirrenden (I erwartet 1234 oder so), so schrieb ich diesen Schnipsel in C#, es zu testen:String.Format Frage

Console.WriteLine(String.Format("{0:#}", 1234.5678)); 
Console.WriteLine(String.Format("{0:#####}", 1234.5678)); 
Console.WriteLine(String.Format("{0:#}", "1234.5678")); 
Console.WriteLine(String.Format("{0:#####}", "1234.5678")); 

Es gibt diese Ausgabe:

1235 
1235 
1234.5678 
1234.5678 

Bitte erläutern.

Antwort

13

Die ersten beiden String.Format Anrufe formatieren eine Nummer (Dezimal) Wert. Die Formatzeichenfolge ist so eingestellt, dass nur der ganzzahlige Teil (vor dem Dezimalpunkt) angezeigt wird, sodass der Wert gerundet wird.

Die zweiten zwei String.Format Anrufe formatieren eine Zeichenfolge Wert, der zufällig die Zeichenfolge Darstellung einer Zahl enthält. Als Ergebnis erhalten Sie genau das zurück, was Sie zur Verfügung gestellt haben. Der Ziffernplatzhalter gilt nur für numerische Werte, die an String.Format übergeben wurden.

+0

32 Sekunden schneller, und besser geschrieben ... schießen! – Instantsoup

+2

+1 obwohl ich nicht entscheiden kann, ob man "numeric" korrigiert oder dir eine extra Abstimmung (nicht möglich) dafür gibt. :-) – tvanfosson

+0

Ah, Rundung ist der Schlüsselpunkt, den ich vermisste. – Brian

0

Zahlen werden gerundet, da keine Dezimalstellen im Muster definiert sind. Saiten werden nicht gerundet, da sie Saiten sind.

0

Die ersten beiden Formate geben keine Dezimalstellen an, daher wird die Zahl entsprechend gerundet. Die letzten beiden Zeilen formatieren keine Zahlen, Sie formatieren Zeichenfolgen, sodass die numerische Formatierung nicht gilt.

0

Wie in dem von Ihnen verknüpften MSDN-Artikel dokumentiert, gilt der Formatbezeichner ('#') nur für numerische Typen.

Benutzerdefinierte numerische Formatbezeichner werden von allen numerischen Typen in der .NET Framework-Klassenbibliothek unterstützt. Dazu gehören die Typen BigInteger, Byte, Dezimal, Double, Int16, Int32, Int64, SByte, Single, UInt16, UInt32 und UInt64.

Sie übergeben eine Zeichenfolge und keinen numerischen Typ in der dritten und vierten Zeile, daher wird keine Formatierung angewendet.

2

Versuchen:

Console.WriteLine(String.Format("{0:#####.##}", 1234.5678)); 

Welche geben 1234,57

Sie müssen die Nachkommastelle angeben. Außerdem sind die letzten beiden Strings, so dass Zahlenformate nicht gelten.

0

Die ersten beiden sind Zahlen, also wird die Formatierung angewendet, sie werden aufgerundet und die Dezimalzahl wird verworfen. Die zweiten beiden sind Zeichenfolgen, daher wird keine Zahlenformatierung angewendet.