String.Format liefert kein korrektes Ergebnis für das Zahlenformat

8

Warum liefert die folgende Ausgabe ein falsches Ergebnis,

? %Vor%

Ausgabe ist {N} und nicht {95.00} wie erwartet.

Missverstehe ich das Konzept der Flucht von { } oder mache ich etwas falsches mit dem Zahlenformat?

    
Prateek 09.12.2013, 07:07
quelle

2 Antworten

6

Ja, das angegebene output ist vollkommen richtig und Ihr Verständnis ist auch richtig, dass { , } in string.Format von { , } entkernt werden und die Zeichenkette in Number formatiert werden soll Verwende {0:N} .

Aber wenn Sie nach der Ausgabe {95.00} suchen, funktioniert das Format {{{0:N}}} nicht wie erwartet, deshalb sollten wir nicht verstehen, wie die obige Anweisung interpretiert wird,

  • Die ersten beiden geschweiften Klammern sind mit Escapezeichen versehen, da wir { gefolgt von { verstehen.
      

    druckt { bei Ausgabe

  • Dann haben wir einen Formatierungsabschnitt {0:N}}} , aber der Compiler ist verwirrt, dass } die geschweifte Klammer von {0:N beendet oder es ist eine geschweifte Klammer, gefolgt von } , was zur Bildung eines benutzerdefinierten Formats führt 0:N} . aber Regeln sagen, dass es als benutzerdefiniertes Format betrachtet werden sollte, daher wird es tatsächlich so interpretiert, dass es 0:N}
  • enthält
  • Da weder N noch } irgendetwas für ein benutzerdefiniertes numerisches Format bedeuten, werden diese Zeichen einfach ausgeschrieben und nicht der Wert der referenzierten Variablen.

Also haben wir ausgegeben, {N} .

Die detaillierte Erklärung für oben finden Sie unter String Format FAQ

Wenn Sie nach der Ausgabe {95.00} suchen, verwenden Sie entweder {{ {0:N} }} und es wird 95.00 als Ausgabe mit Leerzeichen zur Verfügung gestellt.

BEARBEITEN Die Lösung von Heinzi ist perfekt für die Ausgabe, die Sie erwarten,

%Vor%     
dbw 09.12.2013, 07:08
quelle
7

Ihr Verständnis ist richtig: Verwenden Sie zwei geschweifte Klammern, um eine einzelne literale Klammer zu erstellen. Das Problem besteht jedoch darin, dass in der Zeichenfolge }}} die ersten zwei Klammern als literale Klammer interpretiert werden und nicht als zweite und dritte , wie Sie es beabsichtigen .

Tatsächlich ist Ihr Beispiel explizit auf der entsprechenden MSDN-Seite aufgeführt als mögliches Problem (Hervorhebung durch mich):

  

Die Art und Weise, wie geschweifte Klammern interpretiert werden, kann zu unerwarteten Ergebnissen führen. Betrachten Sie zum Beispiel das Formatelement "{{{0: D}}}", das eine öffnende geschweifte Klammer, einen numerischen Wert, der als Dezimalzahl formatiert ist, und eine schließende geschweifte Klammer anzeigen soll. Das Formatelement wird jedoch tatsächlich folgendermaßen interpretiert:

     

...

     
  • Das nächste Zeichen ("D") wird als numerischer Dezimalformat-Spezifizierer interpretiert, aber die nächsten zwei geschweiften Klammern ("}}" ergeben eine einzelne geschweifte Klammer.
  •   

Die vorgeschlagene Lösung besteht darin, etwas wie folgt zu verwenden:

%Vor%     
Heinzi 09.12.2013 07:12
quelle

Tags und Links