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
Bastantes respuestas ya. A menudo me refiero a esta hoja de trucos: http://blog.stevex.net/string-formatting-in-csharp/
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 especificar la cadena de formato de esta manera:
String.Format("{0:0.000}", x);
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.#############################");