2010-07-22 66 views
11

Tengo un número con una cantidad variable de dígitos después del punto decimal. Quiero formatear el número con comas y todos los números decimales.¿Cómo puedo formatear un número en C# con comas y decimales?

Por ejemplo: 42,023,212.0092343234

Si uso ToString ("N") consigo sólo 2 decimales, ToString ("f") me da todos los decimales sin comas. ¿Cómo puedo obtener ambos?

Respuesta

12

No estoy seguro (y no se puede probar ahora) pero ¿algo como esto funcionaría?

"#,##0.################" 
+0

Mejor hasta ahora, funciona siempre que los decimales no sean más largos que el número de # ... Esperaba evitar esta opción, pero si es la única forma ... – NotDan

+0

Buena llamada. Yo digo que esta es la mejor respuesta. –

1

Trate ToString("N2")

+0

Eso sólo muestra la última 2 decimales, quiero que se muestren todos pero la cantidad de decimales variará de 0 a? – NotDan

2

ACTUALIZACIÓN: Mirando el MSDN documentation on the System.Double type, veo esto:

Por defecto, un valor doble contiene 15 dígitos decimales de precisión, aunque un máximo de 17 dígitos se mantiene internamente.

Así que creo pdr's on to something, en realidad. Sólo hacer esto:

// As long as you've got at least 15 #s after the decimal point, 
// you should be good. 
value.ToString("#,#.###############"); 

He aquí una idea:

static string Format(double value) 
{ 
    double wholePart = Math.Truncate(value); 
    double decimalPart = Math.Abs(value - wholePart); 
    return wholePart.ToString("N0") + decimalPart.ToString().TrimStart('0'); 
} 

Ejemplo:

Console.WriteLine(Format(42023212.0092343234)); 

Salida:

42,023,212.00923432409763336

Ja, bueno, como pueden ver, esto arroja resultados imperfectos, debido (creo) a problemas matemáticos de punto flotante. Oh bien; es una opción, de todos modos.

+0

Eso probablemente funcionaría, pero me gustaría obtener una cadena de formato que pueda darle a un Control de cuadrícula, o cualquier otra cosa que entienda.El formato de red me permite hacer el formateo y puedo darle el valor real. – NotDan

4
string.Format("{0:#,##0.############}", value); 

le dará hasta 12 cifras decimales.

No hay un especificador de formato personalizado para "todos los dígitos siguientes", por lo que algo así será lo más parecido a lo que desee.

Ten en cuenta también que la precisión de tu variable te limita. Un double solo tiene 15-16 dígitos de precisión, por lo que a medida que su lado izquierdo se agranda, el número de decimales caerá.

-1

Aquí es la forma un tanto para llegar a sus expectativas ...

decimal d = 42023212.0092343234M; 

NumberFormatInfo nfi = (NumberFormatInfo) CultureInfo.InvariantCulture.NumberFormat.Clone(); 

nfi.NumberDecimalDigits= (d - Decimal.Truncate(d)).ToString().Length-2; 

Console.WriteLine(d.ToString("N",nfi)); 

Para obtener más detalles acerca de NumberFormatInfo .. mirar a MSDN ..

http://msdn.microsoft.com/en-us/library/system.globalization.numberformatinfo.aspx

+0

Probablemente porque estás haciendo un doble cast para cadena. –

Cuestiones relacionadas