Sé que es posible eliminar los ceros finales usando # en el patrón de formato:

double value = 92;
string formatted = $"{value:0.#}"; // "92"

Y usar P te da un porcentaje:

double value = .9234;
string formatted = $"{value:P1}"; // "92.3%"

Pero, ¿hay alguna forma de combinar los dos para producir un porcentaje con decimal opcional?

double value .92;
string formatted1 = $"{value:P#}"; // doesn't work. 
string formatted2 = $"{value:P0.#}"; // doesn't work. 

¿Alguien sabe una forma de usar solo el formato para lograr esto sin tener que multiplicar el valor por 100? Esencialmente quiero .92 => 92% y .924 => 92.4%

1
Laith 20 ene. 2018 a las 14:38

3 respuestas

La mejor respuesta

Ok, esto es un poco embarazoso, pero aparentemente es así de fácil:

double value1 .92;
double value2 .923;
string formatted1 = $"{value:0.#%}"; // "92%" 
string formatted2 = $"{value:0.#%}"; // "92.3%"

El signo % es la notación utilizada para multiplicar el número por 100 y agregar el signo de porcentaje. Usar P es una notación más corta, pero % le permite personalizar la salida.

Por lo tanto, la cadena de formato es igual que el estándar 0.# pero con un signo de porcentaje al final 0.#%

2
Laith 14 feb. 2018 a las 05:00

Si no desea multiplicar, puede eliminar los ceros finales con expresiones regulares. pero si buscas rendimiento, el enfoque de multiplicación (en otra respuesta) es mucho más rápido.

double value = .9253;
string formatted = $"{value:P2}"; // or P with any number you like.
formatted = Regex.Replace(formatted, @"(?<=\d\.\d+)0+%$|\.0+%", "%");
0
M.kazem Akhgary 20 ene. 2018 a las 13:24

Documentación especifica solo el especificador de precisión para la modificación. Si quieres algo como lo que publicaste, tienes que ir más tedioso:

double value = 0.924;
string formatted = $"{value * 100:0.##}%";

El resultado es: 92,4%

0
Filip Konečný 20 ene. 2018 a las 12:00
48355670