Niestandardowy ciąg formatu liczbowego, aby zawsze wyświetlać znak

188

Czy jest jakiś sposób na określenie standardowego lub niestandardowego ciągu formatu liczbowego, aby zawsze wyświetlał znak, czy to + ve czy -ve (chociaż nie powinienem wiedzieć, co powinien zrobić dla zera!)

Craig Shearer
źródło

Odpowiedzi:

297

Tak, możesz. Istnieje formatowanie warunkowe. Zobacz Formatowanie warunkowe w MSDN

na przykład:

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

Gdzie każda sekcja oddzielona średnikiem reprezentuje liczby dodatnie i ujemne

lub:

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

jeśli nie chcesz, aby zero miało znak plus.

gcores
źródło
1
Naprawiono błąd, w wyniku którego negatywy nie otrzymywały minusa.
Roman Starkov,
Bardzo Ci dziękuję! Rozwalam głowę przez około godzinę, aby dowiedzieć się, co jest odpowiednikiem flagi „+” printf w C #, a ty dałeś mi odpowiedź.
rbaleksandar
4
z +#;-#, dla wartości 0 I dostać tylko „+”, bez rzeczywistego 0. Dla mnie Chcę 0 pojawiać się jako „+0”, tak to działa: +#;-#;+0.
orion elenzil
3
Dzięki! Mieszanie tego z ''robi świetne rzeczy! Spójrz na to Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! Zaoszczędziło mi to dużo czasu i setki ifwypowiedzi! :)
Shahab
1
@orionelenzil Miałem ten sam problem. Możesz również zrobić +0;-#zamiast. +#;-#;+0Ta odpowiedź była dla mnie bardzo myląca.
Kamil Szot,
56

Uwaga: w przypadku formatowania warunkowego wartość ujemna nie otrzymuje automatycznie znaku. Musisz zrobić

string MyString = number.ToString("+#;-#;0");
Luk
źródło
Jak zauważyli inni, +0;-#daje ten sam wynik z czystszym kodem.
Andrew
32

Możesz także użyć ciągów formatujących w string.Format (); ciąg formatu jest oddzielony od indeksu dwukropkiem („:”)

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

Dla liczby {+1, -1, 0} daje to:

1, Znak siły +1, Brak znaku dla zera +1
-1, Znak siły -1, Brak znaku dla zera -1
0, Znak siły +0, Brak znaku dla zera 0

Możesz również użyć interpolowanego ciągu zamiast string.Formatuzyskać ten sam wynik:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";
Edward
źródło
W ostatnim wierszu odpowiedzi powinna znajdować się informacja „Domyślny format 0, znak siły +, brak znaku zero”. ponieważ jest to rzeczywisty wynik +#;-#formatu dla wartości 0
Kamil Szot
Dziękuję, Kamil - tęskniłem za tym. Poprawiłem teraz format znaku siły: + #; - #; + 0 (zamiast + #; - #)
Edward
1
Można uzyskać zachowanie znak siły z prostszej formie: +0;-#. :)
Andrew,
@Andrew, rzeczywiście, ale wolę +#;-#;+0się +#;-#jak to czyni go bardziej zrozumiałym, że 0 zostanie sformatowana jako +0
Edward
10

W przeciwieństwie do innych odpowiedzi wydaje się, że jeśli chcesz uzyskać +1, -1, +0 (dla argumentów 1, -1, 0), musisz użyć formatu:

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

lub

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

Jeśli użyjesz tylko +#;-#, wyświetli się +(nie +0) dla 0.

Niestandardowy specyfikator „#” (na https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Zauważ, że ten specyfikator nigdy nie wyświetla zera, który nie jest cyfrą znaczącą, nawet jeśli zero jest jedyną cyfrą w ciągu. Wyświetli zero tylko wtedy, gdy jest to cyfra znacząca w wyświetlanej liczbie.

Pamiętaj również, że jeśli potrzebujesz jakiejkolwiek precyzji dziesiętnej, musisz ją tak określić:

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

lub, jeśli nie chcesz zer zawsze się wyświetlać, tak:

String.Format("{0:+0.00;-#.00}", 0));  // output: +0.00
Kamil Szot
źródło
1

Dla wyrażenia liczbowego dowolnego typu:

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

Użyj trzech części dla trzech przypadków: pozytywny; negatywny; zero

Inne aspekty przykładu:

  • Zero nie jest podpisane. Możesz wyświetlać go jako cokolwiek, na przykład „zero”.

  • Wartości bezwzględne mniejsze niż jeden mają wiodące 0 przed kropką dziesiętną. Dostosuj się do smaku.

  • Liczba cyfr odpowiada największej i najmniejszej bezwzględnej wartości dziesiętnej. Dostosuj się do smaku.

  • Znak dziesiętny jest zależny od kultury. .NET zastępuje.

  • Separatory grupowania są opcjonalne. Postać jest specyficzna dla kultury. .NET zastępuje. (Pozycje są również specyficzne dla kultury, ale jest kontrolowane tylko przez ciąg formatu.) Możesz również użyć dowolnego innego znaku oprócz znaków specjalnych dla Format (które obejmują. # 0).

Tom Blodget
źródło
0

Nie mogę komentować, więc odpowiem tutaj (system reputacji orzechów ....)

Możesz bardzo dobrze użyć number.ToString ("+ 0; - #"), aby utworzyć format czasu UTC String

Tutaj pokazano w kodzie PowerShell

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

Dziękuję @gcores https://stackoverflow.com/users/40256/gcores

Peter Kriegel
źródło