2011-01-24 19 views
42

Quiero formatear una cadena como un decimal, pero el decimal contiene algunos ceros siguientes después del decimal. ¿Cómo lo formateo de manera que desaparezcan esos 0 sin sentido?¿Cómo puedo formatear un C# decimal para eliminar los siguientes 0's extra?

string.Format("{0}", 1100M); 
string.Format("{0}", 1100.1M); 
string.Format("{0}", 1100.100M); 
string.Format("{0}", 1100.1000M); 

muestra:

1100 
1100.1 
1100.100 
1100.1000 

pero yo quiero que sea:

1100 
1100.1 
1100.1 
1100.1 

Como referencia, aquí hay otras cuestiones que son esencialmente duplicados de éste, que he encontrado gracias a las respuestas dadas aquí:

+0

Es 1002.231 ¿Solo un ejemplo? Es decir, ¿le gustaría que 1.12000 fuera 1.12 o 1.120? – n8wrl

+1

Tenga en cuenta que si quiere un valor * decimal *, debe usar uno, p. 1100,1000m. Tenga en cuenta la "m" para "decimal literal". –

+0

@ Jon: Gracias me di cuenta de que también y fue a arreglarlo, y su comentario me estaba esperando cuando regresé .. Tan rápido ...;) –

Respuesta

77

Usted puede utilizar ToString() con el General ("G") Format Specifier para lograr el resultado deseado . Los ceros finales se truncan al usar esta cadena de formato con una precisión especificada. Para evitar el redondeo en cualquier situación, deberá establecer la precisión al máximo permitido para decimales (29).

La línea de código para producir lo que desea es number.ToString("G29"), donde number es su decimal original.

Tenga en cuenta que cualquier número menor que 0.0001 se convertirá a notación científica. Más detalles sobre cómo funciona este formateador se pueden encontrar en el enlace de referencia anterior.

+5

Creo que esta es la mejor solución a la pregunta. – Wegged

+2

Concur - respuesta conmutada. Gracias, @Herohtar. –

+1

ADVERTENCIA: Tenga cuidado con valores como 0.000001. El formato G29 los presentará de la manera más breve posible, por lo que cambiará a la notación exponencial. string.Format ("{0: G29}", decimal.Parse ("0,00000001", System.Globalization.CultureInfo.GetCultureInfo ("en-U S"))) dará "1E-08" como el resultado. crédito va a Konrad aquí: http://stackoverflow.com/questions/4525854/remove-trailing-zeros/4525983#4525983 –

3

Se puede especificar el format string así:

String.Format("{0:0.000}", x); 
+2

Pero no sé si tiene tres decimales al final, lo digo solo como un ejemplo. Haré la pregunta más clara. –

1
String.Format("{0:0.##}", 123.0); // "123" 
+0

falla en 123.456789m. –

+0

tiene que ser ... String.Format ("{0: 0.0 ##}", 123.456789m) Gracias –

4

No son necesariamente sin sentido - que indican la precisión durante el cálculo. Los decimales mantienen su nivel de precisión, en lugar de normalizarse.

Tengo un código en this answer que devolverá un valor normalizado; podría usarlo y formatear el resultado. Por ejemplo:

using System; 
using System.Numerics; 

class Test 
{ 
    static void Display(decimal d) 
    { 
     d = d.Normalize(); // Using extension method from other post 
     Console.WriteLine(d); 
    } 

    static void Main(string[] args) 
    { 
     Display(123.4567890000m); // Prints 123.456789 
     Display(123.100m);  // Prints 123.1 
     Display(123.000m);  // Prints 123 
     Display(123.4567891234m); // Prints 123.4567891234 
    } 
} 

I sospechoso que la mayoría de los enfoques de cadena de formato se producirá un error. Supongo que una cadena de formato de "0". y luego 28 # caracteres funcionarían, pero sería muy feo ...

+1

Parece que tu solución es para .Net 4.0 solamente. – Gabe

+0

@Gabe: a menos que use una implementación de BigInteger de terceros, sí. También es bastante ineficiente. Por otro lado, tiene la ventaja de funcionar :) –

1

Creo que quiere hacer:

var s = String.Format("{0:#####.###}"); 
+0

Falla por 123.45678900m. –

1

Algo hacker, pero esto debería funcionar:

decimal a = 100.00M; 
string strNumber = string.Format("{0}", a); 
Console.WriteLine(strNumber.Contains('.') ? strNumber.TrimEnd('0').TrimEnd('.') : strNumber); 
+0

¡Ack! ¿Qué pasa si 'a = 100,000'? O 'a = 0'? – Gabe

+0

¿Qué pasa si 'a = 100M'? – kerkeslager

+0

@Gabe Estaba en el proceso de arreglar – Davy8

3

¿Qué tal:

string FormatDecimal(decimal d) 
{ 
    const char point = System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator[0]; 
    string s = d.ToString(); 
    // if there's no decimal point, there's nothing to trim 
    if (!s.Contains(point) == -1) 
     return s; 
    // trim any trailing 0s, followed by the decimal point if necessary 
    return s.TrimEnd('0').TrimEnd(point); 
} 
+0

Uso System.Globalization.NumberFormatInfo.CurrentInfo.NumberDecimalSeparator en lugar de ''? – Yoshi

20
string s = d.ToString("0.#############################"); 
-2
double a = 1100.00 
double b =1100.1 
double c = 1100.100 
double d =1100.1000 

Remove last zero after point 


string stra = a.toString("0.00").TrimEnd('0').TrimEnd('.'); 
string strb = b.toString("0.00").TrimEnd('0').TrimEnd('.'); 
string strc = c.toString("0.00").TrimEnd('0').TrimEnd('.'); 
string strd = d.toString("0.00").TrimEnd('0').TrimEnd('.'); 

Output 

1100 
1100.1 
1100.1 
1100.1 
3

A diferencia de lo que todo el mundo recomienda el uso de un especificador G formato que sugeriría lo siguiente para preservar tanto separador de miles y el punto decimal, mientras que la eliminación de ceros de la izquierda extra:

{0:#,#.##} 

El resultado de esta el formato es mucho mejor que G en la mayoría de los casos:

String.Format("{0:#,#.##}",25/2.4); 
10.42 

String.Format("{0:#,#.##}",1000000); 
1,000,000 

String.Format("{0:#,#.##}",1000000.3600000); 
1,000,000.36 

An d el especificador G realmente no puede manejar todas las combinaciones posibles:

String.Format("{0:G29}",25/2.4); 
10.416666666666668 

String.Format("{0:G2}",25/2.4); 
10 

String.Format("{0:G29}",1000000.3600000); 
1000000.36 

String.Format("{0:G2}",1000000.3600000); 
1E+06 
Cuestiones relacionadas