Zahlen zu Zeichenketten formatieren mit Vorzeichen in C#


Als Softwareentwickler lernt man ständig dazu. Selbst dann, wenn man sich schon viele Jahre mit einer Programmiersprache beschäftigt. Einige Dinge benötigt man selten und andere programmiert man aus Unwissenheit selbst, obwohl sie in dem verwendeten Framework enthalten sind. So ging es mir mit der string.Format-Methode in C#. Die Möglichkeiten dieser Methode sind umfangreicher, als mir bekannt war.

Soll in C# der Wert eines Zahlendatentyps in eine Zeichenkette umgewandelt werden, funktioniert das am einfachsten mit der ToString-Methode. Diese Methode ist absolut pflegeleicht und funktioniert fast überall. Wenn es sein muss, können sogar Fenster, Formulare und Listen mit ToString in eine Zeichenkette umgewandelt werden. Ob das Ergebnis immer nützlich ist, steht auf einem anderen Blatt. Für Objekte erhält man oftmals nur den Typ als Zeichenkette, es sein denn, die Klasse überschreibt die ToString-Methode, die sie vom Typ Object erbt. Das kann manchmal erforderlich sein. Sinnvoll und Leistungsfähiger ist ToString bei Umwandlung von Zahlendatentypen. Der Methode kann ein Parameter übergeben werden, der festlegt, wie das Ergebnis aussehen soll. Beispielsweise der Parameter N2. Er veranlasst eine numerische Konvertierung mit zwei Nachkommastellen.

double dValue = 12345.678;

string sValue = dValue.ToString(„N2");

Welche Zeichen als Dezimaltrennzeichen und für die Ziffengruppierung verwendet werden, ist abhängig von den Einstellungen des Betriebssystems. Es ist jedoch möglich, bei der Konvertierung eine CultureInfo anzugeben und die Formatierung damit festzulegen.

double dValue = 12345.678;

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");

string xValue = dValue.ToString("N2", culture);

Soll der umgewandelte Wert um ein oder mehr Zeichen für eine Einheit erweitert werden, ist es möglich, diese Zeichen mit einem + an die Zeichenkette anzuhängen. Etwas eleganter ist der Einsatz von string.Format. Diese Methode ist besonders dann zu empfehlen, wenn eine Zeichenkette aus mehreren Werten zusammengestellt werden soll.

Jeder Wert wird in der Zeichenkette durch einen Platzhalter definiert. Die umzuwandelnden Werte folgen dann als kommagetrennte Liste. Der Plathhalter, eine Zahl, bestimmt die Position des Wertes in der Liste und beginnt, wie in C# üblich, mit 0. Als ersten Parameter akzeptiert string.Format optional ebenfalls eine CultureInfo.

double dValue = 12345.678;

CultureInfo culture = CultureInfo.CreateSpecificCulture("en-US");

string xValue = dValue.ToString("N2", culture) + " €";

string yValue = string.Format(culture, "{0:N2} €", dValue);

Mit diesen Methoden arbeite ich seit Jahren ohne Probleme. Heute wurde ich allerdings mit einer Anforderung konfrontiert, die für mich neu war. Ist der Zahlenwert negativ, wird der konvertierten Zeichenkette ein Minuszeichen vorangestellt. Bei positiven Werten gibt es jedoch kein Pluszeichen. Das war aber gewünscht. Es ist keine Herausforderung, das fehlende Zeichen selbst zu ergänzen. Eine Überprüfung, ob eine Zahl negativ ist, gehört vermutlich zu ersten Dingen, die ein aufstrebender Programmierer lernt. Das ist aber nicht nötig. Die Methode string.Format kann bei Bedarf auch ein Pluszeichen einfügen. Die Formatierung sieht dann allerdings ganz anders aus:

string zValue = string.Format(culture, "{0:+###,###.##; -###,###.##} €", dValue);

Es fällst sofort ins Auge, dass es hier zwei Angaben zur Formatierung gibt. Eine für positive Zahlen und eine andere für negative Zahlen. Die Anzahl der #-Symbole nach dem Punkt gibt an, wie viele Nachkommastellen der umgewandelte Wert haben soll. Die Gruppen der #-Symbole vor dem Punkt bestimmen die Ziffengruppierung. Leider verleitet diese Art der Formatierung leicht zu dem Trugschluss, man könne Ziffern auch in Gruppen zu nur zwei Zeichen anordnen, wenn man nur die Anzahl der #-Symbole reduziert. Das funktioniert nicht. Es ist auch nicht erforderlich, mehr Gruppen zu definieren, wenn die Zahl größer als 999.999 ist. Die Ziffengruppierungen werden in diesem Fall automatisch ergänzt.

Der Wert 0 wird mit dieser Formatierung nicht in eine Zeichenkette formatiert, weil er weder positiv noch negativ ist. Es fehlt eine zusätzliche Angabe, wie mit der 0 zu verfahren ist. In der Regel soll dann eine 0 angezeigt werden.

string zValue = string.Format(culture, "{0:+###,###.##; -###,###.##; 0} €", dValue);

Das Ergebnis der Umwandlung muss nicht zwangsläufig eine zu einer Zeichenkette konvertierte Zahl sein. Es ist möglich, für positive, negative und Null-Werte beliebige Texte zu zu verwenden und gar keine Zahlen auszugeben. Die string.Format-Methode wird dadurch extrem vielseitig.

string textValue = string.Format(culture, "{0:Positiv; Negativ; Null}", dValue);


Geschrieben am: 17.10.2020
Technologien: Window, C#, .Net