2016-06-29 16 views
0

Ich habe eine einfache Klasse, die eine Eigenschaft Format enthält, die auf einen beliebigen angegebenen Formatbezeichner eingestellt ist. Ich verwende dann die Eigenschaft dieser Klasse, um, wie der Name schon sagt, die Zeichenkette zu formatieren.String-Format gibt unerwartete Ergebnisse zurück

Nehmen Sie das folgende Beispiel:

public class FormatDefinition { 
    public string Format { get; set; } 
} 

class Program { 
    static void Main() { 

     var formatDefinition = new FormatDefinition { 
      Format = "N" 
     }; 

     var number = 20.5; 

     var formatOne = string.Format("{0:" + formatDefinition.Format + "}", number); 
     var formatTwo = string.Format("{0:formatDefinition.Format}", number); 
     var formatThree = $"{number:formatDefinition.Format}"; 

     Console.WriteLine(formatOne);  // 20.5 
     Console.WriteLine(formatTwo);  // formatDefinition21Format 
     Console.WriteLine(formatThree);  // formatDefinition21Format 

     Console.ReadLine(); 
    } 
} 

Kann jemand bitte erklären, warum formatTwo und formatThree ein Ergebnis von formatDefinition21Format haben? Es scheint, dass der Zeitraum . durch die formatierte Zahl ersetzt wird.

+2

Sie geben einen [benutzerdefinierten numerischen Formatstring] (https://msdn.microsoft.com/en-us/library/0c899ak8.aspx) an, der aus dem String '" formatDefinition.Format "' besteht. Dies bedeutet * konstante Zeichenkette "formatDefinition" * gefolgt vom Dezimalpunkt (und daher die ganze Zahl hier) gefolgt von * konstanter Zeichenkette "Format" *. Die Zahl wird auf Null Dezimalstellen gerundet, da nach dem Dezimaltrennzeichen keine Ziffern angegeben sind. Die Zeichenfolge 'formatDefinition.Format' wird nicht als C# -Code interpretiert. – Blorgbeard

+0

C# führt keine String-Interpolation bei allen vorherigen C# 6 durch, und selbst dann müssen Sie dem Compiler mitteilen, dass es das ist, was Sie wollen. –

+0

@blorgbeard das macht völlig Sinn und ist die klarste Antwort auf mich. Vielen Dank für Ihr Feedback. Wenn Sie es als Antwort hinzufügen, akzeptiere ich. – Sam

Antwort

1

Sie geben eine custom numeric format string an, die aus der Zeichenfolge "formatDefinition.Format" besteht.

Diese konstanten String „formatDefinition“ von dem Komma (und damit die gesamte Zahl geht hier), gefolgt von konstanter Zeichenkette „Format“ gefolgt verstanden.

Die Zahl wird auf null Dezimalstellen gerundet, da nach dem Dezimaltrennzeichen keine Ziffern angegeben sind.

Die Zeichenfolge formatDefinition.Format wird nicht als C# -Code interpretiert.

0

Nach dem documentation für Custom Number Format Strings:

Für Festpunktformatstrings (das heißt, Formatstrings, die keine wissenschaftliche Notation Format Zeichen enthalten) werden Zahlen so viele gerundet Nachkommastellen, da rechts von Dezimalstellen stehen.

Es liegt daran, dass Sie einen Dezimalpunkt mit keinen Ziffernplatzhaltern auf der rechten Seite haben. Sie sagen es, um die Zahl auf null Dezimalstellen zu runden - mit anderen Worten auf die nächste ganze Zahl.

Diese sind alle funktional gleich - alle zurück a22b.

string.Format("{0:a.b}", 21.5); 
string.Format("{0:a0b}", 21.5); 
string.Format("{0:a0.b}", 21.5); 

Hier ist ein DotNetFiddle.