Cadena de formato numérico personalizado para mostrar siempre el signo

188

¿Hay alguna manera de que pueda especificar una cadena de formato numérico estándar o personalizado para que siempre salga el signo, ya sea + ve o -ve (aunque no estoy seguro de lo que debería hacer para cero)

Craig Shearer
fuente

Respuestas:

297

Sí tu puedes. Hay formato condicional. Ver Formato condicional en MSDN

p.ej:

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

Donde cada sección separada por un punto y coma representa números positivos y negativos

o:

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

si no quieres que el cero tenga un signo más.

gcores
fuente
1
Se corrigió un error por el cual los negativos no obtenían un menos.
Roman Starkov
¡Muchas gracias! Me he estado rompiendo la cabeza durante una hora para descubrir cuál es el equivalente de la bandera '+' de printf en C # y me diste LA respuesta.
rbaleksandar
44
con +#;-#, para el valor 0 consigo sólo "+", sin real 0. para mí quiero 0 a aparecer como "0", por lo que esta obra: +#;-#;+0.
orion elenzil
3
¡Gracias! ¡Mezclar esto ''hará grandes cosas! Mira esto Changes.ToString("'('#' ▲)';'('#' ▼)';''"):! ¡Me ahorró mucho tiempo y cientos de ifdeclaraciones! :)
Shahab
1
@orionelenzil Tuve el mismo problema. También podría hacerlo en +0;-#lugar de +#;-#;+0Esta respuesta fue realmente engañosa para mí.
Kamil Szot
56

Tenga cuidado, cuando se utiliza el formato condicional, el valor negativo no obtiene automáticamente un signo. Necesitas hacer

string MyString = number.ToString("+#;-#;0");
Luk
fuente
Como otros señalaron, +0;-#le da el mismo resultado con un código más limpio.
Andrew
32

También puede usar cadenas de formato en string.Format (); la cadena de formato se separa del índice con dos puntos (':')

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

Para el número {+1, -1, 0} esto da:

1, signo de fuerza +1, sin signo de cero +1
-1, signo de fuerza -1, sin signo de cero -1
0, signo de fuerza +0, sin signo de cero 0

También puede usar una cadena interpolada en lugar de string.Formatobtener el mismo resultado:

var f = $"{number}, Force sign {number:+#;-#;+0}, No sign for zero {number:+#;-#;0}";
Eduardo
fuente
La última línea de su respuesta debe decir "Formato predeterminado 0, Forzar signo +, Sin signo para cero 0". porque ese es el resultado real del +#;-#formato para el valor 0
Kamil Szot
Gracias, Kamil, me perdí eso. Ahora he corregido el formato de signo de fuerza: + #; - #; + 0 (en lugar de + #; - #)
Edward
1
Se puede obtener el comportamiento señal de fuerza con un formato más sencillo: +0;-#. :)
Andrew
@ Andrew, en efecto, pero prefiero +#;-#;+0más +#;-#ya que esto hace que sea más claro que 0 se indicará como 0
Edward
10

Al contrario de las otras respuestas, parece que si desea obtener +1, -1, +0 (para los argumentos 1, -1, 0) debe usar el formato:

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

o

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

Si usa solo +#;-#, se mostrará solo +(no +0) para 0.

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

Tenga en cuenta que este especificador nunca muestra un cero que no sea un dígito significativo, incluso si cero es el único dígito en la cadena. Mostrará cero solo si es un dígito significativo en el número que se está mostrando.

Además, tenga en cuenta que si necesita alguna precisión decimal, debe especificarla así:

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

o, si no quieres que siempre aparezcan ceros, así:

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

Para una expresión numérica de cualquier tipo:

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

Use tres partes para tres casos: positivo; negativo; cero

Otros aspectos del ejemplo:

  • Cero no está firmado. Puede hacer que se muestre como cualquier cosa, como "cero".

  • Los valores absolutos menores que uno tienen un 0 inicial antes del punto decimal. Ajustar al gusto.

  • El número de dígitos es para los valores decimales absolutos más grandes y más pequeños. Ajustar al gusto.

  • El carácter de punto decimal es específico de la cultura. .NET sustitutos.

  • Los separadores de agrupación son opcionales. El personaje es culturalmente específico. .NET sustitutos. (Las posiciones también son específicas de la cultura, pero eso solo está controlado por su cadena de formato). También usa cualquier otro carácter excepto los caracteres especiales para Formato (que incluyen,. # 0).

Tom Blodget
fuente
0

No puedo comentar, así que respondo aquí (sistema de reputación loco ...)

Puede usar number.ToString ("+ 0; - #") muy bien para producir el formato de tiempo de cadena UTC

Aquí se muestra en el código de PowerShell

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

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

Peter Kriegel
fuente