2008-11-17 20 views
15

Me gustaría agrupar los dígitos en un doble por miles, pero también en la salida, sin embargo, el número de decimales está realmente en el número. No puedo entender la cadena de formato.Formatee un número con comas, pero mantenga los decimales

1000 => 1,000 
100000 => 100,000 
123.456 => 123.456 
100000.21 => 100,000.21 
100200.123456 => 100,200.123456 

Aviso legal (que no es tan sencillo como se piensa):

  • Por favor, no me señale this question que no responde a mi pregunta
  • Por favor, no me apuntan a MSDN, los artículos no me han ayudado. (Si usted cree que los estoy leyendo de forma incorrecta, les lee a sí mismo y publicar la respuesta correcta)
  • .ToString("n") no funciona, redondea los dígitos

Respuesta

10

Esto parece hacer exactamente lo que quiere:

public void Code(params string[] args) 
{ 
    Print(1000); 
    Print(100000); 
    Print(123.456); 
    Print(100000.21); 
    Print(100200.123456); 
} 

void Print(double n) 
{ 
    Console.WriteLine("{0:###,###.#######}", n); 
} 

1,000 
100,000 
123.456 
100,000.21 
100,200.123456 
+0

Si tiene más de 7 lugares decimales, ¿no lo truncarán? – MusiGenesis

+0

Parece que sí, que es menos que ideal, pero puedo sacarlo a 12 decimales, lo que debería ser un límite para mis propósitos. –

+1

Aunque no funcionará para un número arbitrario de decimales. Sin embargo, dado que el doble tiene una precisión de 15-16 dígitos, "{0: ##, ###, ###, ###, ###, ## 0. ############ ###} parece capturar todos los dobles posibles con todos los dígitos posibles. Tenga en cuenta que prefiero un 0 líder. – tvanfosson

0

Prueba con esto:

VB:

Dim vals() As Double = {1000, 100000, 123.456, 100000.21, 100200.123456} 
For Each val As Double in vals 
    Console.WriteLine(val.ToString("###,###.#########")) 
Next val 

C#:

double[] vals = new double[] {1000, 100000, 123.456, 100000.21, 100200.123456}; 
foreach (double val in vals) 
{ 
    Console.WriteLine(val.ToString("###,###.#########")); 
} 

T El problema es que no hay un formato para manejar una cantidad arbitraria de decimales. Sin embargo, dado que solo puede almacenar con una precisión muy limitada, puede usar eso y agregar algunos más # caracteres según sea necesario para cubrirlo, suponiendo que esté dispuesto a dejar que corte cualquier 0 insignificante.

Y el enlace de MSDN que publicó es el lugar exacto al que irá a leer cómo hacerlo.

1

Trate simplemente usar "#, #", esto se suma las comas para miles et al, pero no sé si va a mantener a los decimales , de lo contrario "#, ###. ####################", o cualquier número de símbolos '#' que desee después del decimal.

0

Esto podría ser un poco lento, pero va a hacer lo que querer.

public static string FormatNumber(double num) 
{ 
    string s = num.ToString(); 
    string result = ""; 

    if(s.IndexOf('.') != -1) 
    { 
     result = s.Substring(s.IndexOf('.')); 
     s = s.Substring(0, s.IndexOf('.')); 
    } 

    while (s.Length > 3) 
    { 
     result = "," + s.Substring(s.Length - 3); 
     s = s.Substring(0, s.Length - 3); 
    } 
    if (s.Length == 0) 
     return result.Substring(1); 
    return s + result; 
} 
+1

Downvoting es un poco duro para algo que responde a la pregunta no? Si bien no es la mejor solución, es una solución. – LeppyR64

2

Un hilo antiguo, pero ninguna de las respuestas me parece del todo satisfactoria. La mayoría de ellos convierte a cero en la cadena vacía, incluido el que tiene más votos ascendentes.

Creo que una mejor solución es "#,##0.#################", que al menos muestra ceros. Todavía es feo. Debe haber una mejor manera.

double[] vals = new double[] { 0.0, 0.1234, -0.1234, 1.0, 
           123456789.123456, 123456789.0, 
           0.123456789123456 }; 
foreach (double val in vals) 
{ 
    Console.WriteLine(val + ": " + val.ToString("#,##0.#################")); 
} 
Cuestiones relacionadas