Benutzerdefinierte Zeichenfolge im numerischen Format, um immer das Zeichen anzuzeigen

188

Gibt es eine Möglichkeit, eine Standard- oder benutzerdefinierte Zeichenfolge im numerischen Format anzugeben, um immer das Vorzeichen auszugeben, sei es + ve oder -ve (obwohl ich nicht sicher bin, was es für Null tun soll?)

Craig Shearer
quelle

Antworten:

296

Ja, du kannst. Es gibt eine bedingte Formatierung. Siehe Bedingte Formatierung in MSDN

z.B:

string MyString = number.ToString("+0;-#");

Wobei jeder durch ein Semikolon getrennte Abschnitt positive und negative Zahlen darstellt

oder:

string MyString = number.ToString("+#;-#;0");

Wenn Sie nicht möchten, dass die Null ein Pluszeichen hat.

gcores
quelle
1
Es wurde ein Fehler behoben, durch den Negative kein Minus erhielten.
Roman Starkov
Vielen vielen Dank! Ich habe mir seit ungefähr einer Stunde den Kopf gebrochen, um herauszufinden, was der '+' - Flagge von printf in C # entspricht, und du hast mir DIE Antwort gegeben.
Rbaleksandar
4
mit +#;-#, für den Wert 0 bekomme ich nur "+", ohne tatsächliche 0. für mich möchte ich, dass 0 als "+0" erscheint, also funktioniert das : +#;-#;+0.
Orion Elenzil
3
Vielen Dank! Das Mischen mit ''wird großartige Dinge bewirken! Schau dir das an : Changes.ToString("'('#' ▲)';'('#' ▼)';''")! Es hat mir viel Zeit und Hunderte von ifAussagen gespart ! :)
Shahab
1
@orionelenzil Ich hatte das gleiche Problem. Sie könnten auch tun, +0;-#anstatt +#;-#;+0Diese Antwort war für mich wirklich irreführend.
Kamil Szot
56

Beachten Sie, dass bei Verwendung der bedingten Formatierung der negative Wert nicht automatisch ein Vorzeichen erhält. Du musst tun

string MyString = number.ToString("+#;-#;0");
Luk
quelle
Wie andere betonten, erhalten +0;-#Sie das gleiche Ergebnis mit sauberem Code.
Andrew
32

Sie können Formatzeichenfolgen auch in string.Format () verwenden. Die Formatzeichenfolge wird durch einen Doppelpunkt (':') vom Index getrennt.

var f = string.Format("{0}, Force sign {0:+#;-#;+0}, No sign for zero {0:+#;-#;0}", number);

Für die Zahl {+1, -1, 0} ergibt dies:

1, Kraftzeichen +1, Kein Vorzeichen für Null +1
-1, Kraftzeichen -1, Kein Vorzeichen für Null -1
0, Kraftzeichen +0, Kein Vorzeichen für Null 0

Sie können auch eine interpolierte Zeichenfolge verwenden string.Format, um das gleiche Ergebnis zu erzielen:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";
Edward
quelle
In der letzten Zeile Ihrer Antwort sollte "Standardformat 0, Vorzeichen + erzwingen, kein Vorzeichen für Null 0" stehen. denn das ist das eigentliche Ergebnis des +#;-#Formats für den Wert 0
Kamil Szot
Danke, Kamil - das habe ich verpasst. Ich habe jetzt das Force-Zeichen-Format korrigiert: + #; - #; + 0 (anstelle von + #; - #)
Edward
1
Sie können das Force-Sign-Verhalten in einem einfacheren Format abrufen : +0;-#. :)
Andrew
@ Andrew, In der Tat, aber ich ziehe +#;-#;+0über , +#;-#da dies macht es deutlicher , dass 0 als 0 formatiert werden
Edward
10

Im Gegensatz zu den anderen Antworten scheint es, dass Sie das Format verwenden müssen, wenn Sie +1, -1, +0 (für die Argumente 1, -1, 0) erhalten möchten:

String.Format("{0:+#;-#;+0}", 0));  // output: +0

oder

String.Format("{0:+0;-#}", 0));  // output: +0

Wenn Sie nur verwenden +#;-#, wird nur +(nicht +0) für 0 angezeigt .

Der benutzerdefinierte Bezeichner "#" (unter https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Beachten Sie, dass dieser Bezeichner niemals eine Null anzeigt, die keine signifikante Ziffer ist, selbst wenn Null die einzige Ziffer in der Zeichenfolge ist. Es wird nur dann Null angezeigt, wenn es sich um eine signifikante Ziffer in der angezeigten Zahl handelt.

Beachten Sie auch, dass Sie eine Dezimalgenauigkeit wie folgt angeben müssen:

String.Format("{0:+0.##;-#.##}", 0));  // output: +0

oder, wenn Sie nicht möchten, dass immer Nullen angezeigt werden, so:

String.Format("{0:+0.00;-#.00}", 0));  // output: +0.00
Kamil Szot
quelle
1

Für einen numerischen Ausdruck eines beliebigen Typs:

+###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;-###,###,###,###,###,###,###,###,###,##0.###,###,###,###,###,###,###,###,###,###;0

Verwenden Sie drei Teile für drei Fälle: positiv, negativ, null

Andere Aspekte des Beispiels:

  • Null ist nicht signiert. Sie können es als alles anzeigen lassen, z. B. "Null".

  • Absolutwerte kleiner als eins haben eine führende 0 vor dem Dezimalpunkt. Nach Geschmack einstellen.

  • Die Anzahl der Stellen steht für den größten und den kleinsten absoluten Dezimalwert. Nach Geschmack einstellen.

  • Das Dezimalzeichen ist kulturspezifisch. .NET-Ersatz.

  • Gruppentrennzeichen sind optional. Der Charakter ist kulturspezifisch. .NET-Ersatz. (Die Positionen sind ebenfalls kulturspezifisch, werden jedoch nur von Ihrer Formatzeichenfolge gesteuert.) Sie verwenden auch andere Zeichen als die Sonderzeichen für Format (einschließlich ,. # 0).

Tom Blodget
quelle
0

Ich kann nicht kommentieren, also mache ich hier eine Antwort (verrücktes Reputationssystem ....)

Sie können number.ToString ("+ 0; - #") sehr gut verwenden, um den UTC-String TimeFormat zu erstellen

Hier in PowerShell-Code gezeigt

"$([System.DateTime]::Now.ToString('HH:mm:ss.fff'))$($([System.TimeZoneInfo]::Local.GetUtcOffset([System.DateTime]::Now).TotalMinutes.ToString('+0;-#')))"

Vielen Dank an @gcores https://stackoverflow.com/users/40256/gcores

Peter Kriegel
quelle