Sequência de formato numérico personalizado para exibir sempre o sinal

188

Existe alguma maneira de especificar uma string de formato numérico padrão ou personalizado para sempre exibir o sinal, seja + ve ou -ve (embora o que deva fazer para zero, não tenho certeza!)

Craig Shearer
fonte

Respostas:

296

Sim você pode. Há formatação condicional. Consulte Formatação condicional no MSDN

por exemplo:

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

Onde cada seção separada por ponto e vírgula representa números positivos e negativos

ou:

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

se você não quiser que o zero tenha um sinal de mais.

gcores
fonte
1
Corrigido um erro em que os negativos não recebiam menos.
Roman Starkov 25/10
Muito obrigado! Estou estourando a cabeça há uma hora para descobrir qual é o equivalente da bandeira '+' de printf em C # e você me deu a resposta.
precisa saber é o seguinte
4
com +#;-#, pelo valor 0 I obter apenas "+", sem real 0. para mim eu quero 0 a aparecer como "0", então isso funciona: +#;-#;+0.
Orion elenzil
3
Obrigado! Misturar isso ''fará grandes coisas! Veja isto Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! Isso me salvou muito tempo e centenas de ifdeclarações! :)
Shahab 29/05
1
@orionelenzil Eu tive o mesmo problema. Você também poderia fazer em +0;-#vez de +#;-#;+0Esta resposta foi realmente enganosa para mim.
Kamil Szot
56

Cuidado, ao usar a formatação condicional, o valor negativo não recebe automaticamente um sinal. Você precisa fazer

string MyString = number.ToString("+#;-#;0");
Luk
fonte
Como outros apontaram, +0;-#fornece o mesmo resultado com um código mais limpo.
Andrew
32

Você também pode usar seqüências de caracteres de formato em string.Format (); a string de formato é separada do índice com dois pontos (':')

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

Para o número {+1, -1, 0}, isso fornece:

1, Sinal de força +1, Nenhum sinal para zero +1
-1, Sinal de força -1, Nenhum sinal para zero -1
0, Sinal de força +0, Nenhum sinal para zero 0

Você também pode usar uma sequência interpolada em vez de string.Formatobter o mesmo resultado:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";
Edward
fonte
A última linha da sua resposta deve dizer "Formato padrão 0, sinal de força +, nenhum sinal para zero 0". porque esse é o resultado real do +#;-#formato para o valor 0
Kamil Szot
Obrigado Kamil - senti falta disso. Eu já corrigido o formato vigor sinal: + #; - #; + 0 (em vez de + #; - #)
Edward
1
Você pode obter o comportamento sinal de força com um formato mais simples: +0;-#. :)
Andrew
@ Andrew, De fato, mas eu prefiro +#;-#;+0mais, +#;-#pois isso deixa mais claro que 0 será formatado como +0
Edward
10

Ao contrário das outras respostas, parece que se você deseja obter +1, -1, +0 (para argumentos 1, -1, 0), precisa usar o formato:

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

ou

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

Se você usar apenas +#;-#, será exibido apenas +(não +0) para 0.

O especificador personalizado "#" (em https://msdn.microsoft.com/en-us/library/0c899ak8.aspx )

Observe que esse especificador nunca exibe um zero que não é um dígito significativo, mesmo que zero seja o único dígito na string. Ele exibirá zero apenas se for um dígito significativo no número que está sendo exibido.

Além disso, lembre-se de que, se você precisar de precisão decimal, precisará especificá-la assim:

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

ou, se você não deseja que zeros sempre apareçam, assim:

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

Para uma expressão numérica de qualquer tipo:

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

Use três partes para três casos: positivo; negativo; zero

Outros aspectos do exemplo:

  • Zero não está assinado. Você pode mostrar isso como qualquer coisa, como "zero".

  • Valores absolutos menores que um têm um 0 à esquerda antes do ponto decimal. Ajuste a gosto.

  • O número de dígitos corresponde aos maiores e menores valores decimais absolutos. Ajuste a gosto.

  • O caractere de ponto decimal é específico da cultura. Substitutos do .NET.

  • Os separadores de agrupamento são opcionais. O personagem é específico da cultura. Substitutos do .NET. (As posições também são específicas da cultura, mas são controladas apenas pela string de formato.) Você também usa qualquer outro caractere, exceto os caracteres especiais para Format (que incluem,. # 0).

Tom Blodget
fonte
0

Não posso comentar, então eu respondo aqui (sistema de reputação nuts ...)

Você pode usar number.ToString ("+ 0; - #") muito bem para produzir a string UTC TimeFormat

Aqui mostrado no código do PowerShell

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

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

Peter Kriegel
fonte