Stringa di formato numerico personalizzata per visualizzare sempre il segno


188

Esiste un modo in cui posso specificare una stringa di formato numerico standard o personalizzata per generare sempre il segno, sia esso + ve o -ve (anche se cosa dovrebbe fare per zero, non sono sicuro!)

Risposte:


297

Si, puoi. C'è una formattazione condizionale. Vedi Formattazione condizionale in MSDN

per esempio:

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

Dove ogni sezione separata da un punto e virgola rappresenta numeri positivi e negativi

o:

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

se non vuoi che lo zero abbia un segno più.


1
Risolto un bug per cui i negativi non ricevevano un segno meno.
Roman Starkov,

Grazie mille! Mi sono rotto la testa per circa un'ora per capire qual è l'equivalente della '+' - bandiera di printf in C # e mi hai dato la risposta.
rbaleksandar,

4
con +#;-#, per il valore 0 ottengo solo "+", senza alcuna reale 0. per me voglio 0 apparire come "0", così funziona: +#;-#;+0.
Orion Elenzil,

3
Grazie! Mescolare questo con ''farà grandi cose! Guarda questo Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! Mi ha fatto risparmiare un sacco di tempo e centinaia di ifdichiarazioni! :)
Shahab,

1
@orionelenzil Ho avuto lo stesso problema. Potresti anche fare +0;-#invece di +#;-#;+0Questa risposta è stata davvero fuorviante per me.
Kamil Szot,

56

Attenzione, quando si utilizza la formattazione condizionale il valore negativo non ottiene automaticamente un segno. Devi fare

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

Come altri hanno sottolineato, +0;-#ti dà lo stesso risultato con un codice più pulito.
Andrew,

32

Puoi anche usare stringhe di formato in string.Format (); la stringa di formato è separata dall'indice con due punti (':')

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

Per il numero {+1, -1, 0} questo dà:

1, Forza segno +1, Nessun segno per zero +1
-1, Forza segno -1, Nessun segno per zero -1
0, Forza segno +0, Nessun segno per zero 0

Puoi anche usare una stringa interpolata invece di string.Formatottenere lo stesso risultato:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";

L'ultima riga della tua risposta dovrebbe dire "Formato predefinito 0, Forza segno +, Nessun segno per zero 0." perché questo è il risultato effettivo del +#;-#formato per il valore 0
Kamil Szot

Grazie, Kamil - Mi è mancato. Ora ho corretto il formato del segno di forza: + #; - #; + 0 (invece di + #; - #)
Edward

1
È possibile ottenere il comportamento segno forza con un formato più semplice: +0;-#. :)
Andrew,

@Andrew, in effetti, ma preferisco +#;-#;+0rispetto +#;-#a ciò, poiché questo rende più chiaro che 0 sarà formattato come +0
Edward,

10

Contrariamente alle altre risposte sembra che se si desidera ottenere +1, -1, +0 (per gli argomenti 1, -1, 0) è necessario utilizzare il formato:

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

o

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

Se si utilizza solo +#;-#, verrà visualizzato solo +(non +0) per 0.

Lo identificatore personalizzato "#" (all'indirizzo https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Si noti che questo identificatore non visualizza mai uno zero che non sia una cifra significativa, anche se zero è l'unica cifra nella stringa. Verrà visualizzato zero solo se si tratta di una cifra significativa nel numero visualizzato.

Inoltre, tieni presente che se hai bisogno di una precisione decimale devi specificarla in questo modo:

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

o, se non vuoi che gli zeri vengano visualizzati sempre, in questo modo:

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

1

Per un'espressione numerica di qualsiasi tipo:

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

Utilizzare tre parti per tre casi: positivo; negativo; zero

Altri aspetti dell'esempio:

  • Zero non è firmato. Potresti farlo mostrare come qualsiasi cosa, come "zero".

  • I valori assoluti inferiori a uno hanno uno 0 iniziale prima del punto decimale. Regola a piacere.

  • Il numero di cifre indica i valori decimali assoluti più grandi e più piccoli. Regola a piacere.

  • Il carattere del punto decimale è specifico della cultura. Sostituti .NET.

  • I separatori di raggruppamento sono facoltativi. Il personaggio è specifico per la cultura. Sostituti .NET. (Le posizioni sono anche specifiche della cultura ma sono controllate solo dalla stringa del formato.) Puoi anche usare qualsiasi altro carattere tranne i caratteri speciali per Formato (che includono, # 0).


0

Non posso commentare, quindi faccio una risposta qui (sistema di reputazione folle ....)

Puoi usare number.ToString ("+ 0; - #") molto bene per produrre la stringa di tempo UTC

Qui mostrato nel codice di PowerShell

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

Grazie @gcores https://stackoverflow.com/users/40256/gcores

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.