Строка настраиваемого числового формата для постоянного отображения знака

193

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

Крэйг Ширер
источник

Ответы:

304

Да, ты можешь. Есть условное форматирование. См. Раздел Условное форматирование в MSDN.

например:

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

Где каждый раздел, разделенный точкой с запятой, представляет положительные и отрицательные числа

или:

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

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

gcores
источник
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;-#дает тот же результат с более чистым кодом.
Эндрю
34

Вы также можете использовать строки формата в 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;-#. :)
Эндрю
@ Андрей, действительно, но я предпочитаю +#;-#;+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. (Позиции также зависят от языка и региональных параметров, но контролируются только строкой формата.) Вы также можете использовать любой другой символ, кроме специальных символов для формата (включая,. # 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

Питер Кригель
источник