todouble separador miles formato formatnumber float examples convert c# format decimal tostring

separador - ¿Cómo puedo formatear un C#decimal para eliminar los siguientes 0''s extra?



string.format c# examples (11)

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?

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 quiero que sea:

1100 1100.1 1100.1 1100.1

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


A diferencia de lo que todo el mundo sugiere usar un especificador de formato G , sugeriría lo siguiente para preservar tanto el separador de mil como el punto decimal mientras se eliminan los ceros adicionales:

{0:#,#.##}

El resultado de este 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

Y 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



Creo que quieres hacer:

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


No son necesariamente insignificantes: 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 esta respuesta que devolverá un valor normalizado; podría usarlo y luego 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 } }

Sospecho que la mayoría de los enfoques de cadenas de formato fallarán. Supongo que una cadena de formato de "0". y luego 28 # personajes funcionarían, pero sería muy feo ...



Puede usar ToString() con el Especificador de formato General ("G") 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 quiere 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.


Qué tal si:

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); }


Un poco hackish, pero esto debería funcionar:

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


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


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


string s = d.ToString("0.#############################");