Спеціальний рядок цифрового формату, щоб завжди відображати знак


188

Чи можу я вказати стандартний або спеціальний рядок чисельного формату, щоб завжди виводити знак, будь то + ve чи -ve (хоча що робити для нуля, я не впевнений!)

Відповіді:


297

Так, ти можеш. Існує умовне форматування. Див. Умовне форматування в MSDN

наприклад:

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

Де кожен розділ, розділений крапкою з комою, представляє додатні та від’ємні числа

або:

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

якщо ви не хочете, щоб на нулі був знак плюс.


1
Виправлена ​​помилка, за якою негативи не отримали мінус.
Роман Старков

Дуже дякую! Я мотав голову протягом години, щоб зрозуміти, що еквівалентно прапору '+' - printf в C #, і ти дав мені відповідь.
rbaleksandar

4
з +#;-#, для значення 0 я отримую тільки «+», без фактичного 0. для мене я хочу 0 з'являтися як «0», так це працює: +#;-#;+0.
orion elenzil

3
Дякую! Змішуючи це, ''ви зробите чудові речі! Подивіться на це Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! Це заощадило мені багато часу та сотні ifзаяв! :)
Шахаб

1
@orionelenzil У мене була така ж проблема. Ви також можете зробити +0;-#замість +#;-#;+0цієї відповіді для мене дійсно оманливу.
Каміль Шот

56

Обережно, що при використанні умовного форматування від'ємне значення не отримує автоматично знак. Вам потрібно зробити

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

Як зазначали інші, +0;-#дає такий же результат із чистішим кодом.
Андрій

32

Ви також можете використовувати рядки формату в string.Format (); рядок формату відокремлений від індексу двокрапкою (':')

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

Для номера {+1, -1, 0} це дає:

1, знак сили +1, немає знаку нуля +1
-1, знак сили -1, немає знаку для нуля -1
0, знак сили +0, немає знаку нуля 0

Ви також можете використовувати інтерпольований рядок замість того, string.Formatщоб отримати той самий результат:

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

В останньому рядку вашої відповіді повинно бути "Формат за замовчуванням 0, Знак сили +, Без знака нуля 0". адже це фактичний результат +#;-#формату для значення 0
Каміль Шот

Дякую, Каміле - я це пропустив. Зараз я виправив формат знака сили: + #; - #; + 0 (замість + #; - #)
Едвард

1
Ви можете отримати поведінку знака сили з більш простим форматом: +0;-#. :)
Андрій

@Andrew, Дійсно, але я вважаю +#;-#;+0за краще, +#;-#оскільки це стає зрозумілішим, що 0 буде відформатовано як +0
Едвард

10

На відміну від інших відповідей, здається, що якщо ви хочете отримати +1, -1, +0 (для аргументів 1, -1, 0), вам потрібно використовувати формат:

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

або

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

Якщо ви використовуєте просто, +#;-#він відображатиме просто +(не +0) для 0.

Спеціальний специфікатор "#" (за адресою https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Зауважте, що цей специфікатор ніколи не відображає нуль, який не є значущою цифрою, навіть якщо нуль є єдиною цифрою у рядку. Він буде відображати нуль, лише якщо це значна цифра в кількості, яке відображається.

Також пам’ятайте, що якщо вам потрібна якась десяткова точність, потрібно вказати її так:

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

або, якщо ви не хочете, щоб нулі завжди з’являлися, наприклад:

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

1

Для числового вираження будь-якого типу:

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

Використовуйте три частини для трьох випадків: позитивна; негативна; нуль

Інші аспекти прикладу:

  • Нуль не підписується. Ви можете показувати це як будь-що, наприклад, "нуль".

  • Абсолютні значення, менші за одиницю, мають провідні значення 0 перед десятковою комою. Налаштуйте за смаком.

  • Кількість цифр припадає на найбільші та найменші абсолютні десяткові значення. Налаштуйте за смаком.

  • Десятковий точковий характер є специфічним для культури. .NET замінники.

  • Групувальні роздільники необов’язкові. Характер характерний для культури. .NET замінники. (Позиції також є специфічними для культури, але це лише під контролем рядка формату.) Ви також використовуєте будь-який інший символ, окрім спеціальних символів для Format (які включають,. # 0).


0

Я не можу коментувати, тому я роблю тут відповідь (гайка система репутації ....)

Ви можете дуже добре використовувати number.ToString ("+ 0; - #"), щоб створити UTC String TimeFormat

Тут показано в коді PowerShell

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

Дякуємо @gcores https://stackoverflow.com/users/40256/gcores

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.