2009-04-14 20 views
7

¿Cómo puedo formatear un número con un número fijo de decimales (mantener los ceros finales) donde una variable especifica el número de lugares?¿Cómo puedo formatear un decimal en un número controlado por programa de decimales en C#?

p. Ej.

int x = 3; 
Console.WriteLine(Math.Round(1.2345M, x)); // 1.234 (good) 
Console.WriteLine(Math.Round(1M, x));  // 1 (would like 1.000) 
Console.WriteLine(Math.Round(1.2M, x)); // 1.2 (would like 1.200) 

Tenga en cuenta que ya que quiero para controlar el número de plazas mediante programación, esto no va a funcionar string.Format (seguramente no debo generar la cadena de formato):

Console.WriteLine(
    string.Format("{0:0.000}", 1.2M)); // 1.200 (good) 

¿Debo incluir Microsoft.VisualBasic y use FormatNumber?

Espero que me pierda algo obvio aquí.

Respuesta

12

Trate

decimal x = 32.0040M; 
string value = x.ToString("N" + 3 /* decimal places */); // 32.004 
string value = x.ToString("N" + 2 /* decimal places */); // 32.00 
// etc. 

Espero que esto funcione para usted. Ver

http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

para más información. Si encuentra que el añadiendo un intento poco hacky:

public static string ToRoundedString(this decimal d, int decimalPlaces) { 
    return d.ToString("N" + decimalPlaces); 
} 

continuación, sólo puede llamar a

decimal x = 32.0123M; 
string value = x.ToRoundedString(3); // 32.012; 
+0

¿Cómo se especifica el número de decimales como una variable? Supongo que podría hacer (1.2M) .ToString ("D" + x) pero eso parece un poco hacky –

+0

Bueno, siempre puedes convertirlo en un método de extensión. –

+0

Me está creciendo, gracias también por el método de extensión. –

2

Consulte estos enlaces para obtener ayuda cadena de formato:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

desea que esta :

Console.WriteLine(Math.Round(1.2345M, x).ToString("F" + x.ToString())); 

Además, la llamada .ToString redondeará para usted si es necesario para que pueda saltar la llamada Math.Round y simplemente hacer esto:

Console.WriteLine(1.2345M.ToString("F" + x.ToString())); 
+0

OK, entonces generar el formato de cadena ("F" + x.ToString()) es el truco, entonces? Supuse que solo estaba perdiendo una biblioteca. Gracias, Joel! –

+0

Pero ...¿describiste exactamente lo mismo en los comentarios de la respuesta anterior como "hacky"? –

+0

Una vez es un truco. Dos veces es una mejor práctica.

1

Algo como esto debe manejarlo:

int x = 3; 
string format = "0:0."; 
foreach (var i=0; i<x; i++) 
    format += "0"; 
Console.WriteLine(string.Format("{" + format + "}", 1.2M)); 
4

Prueba esto para crear dinámicamente su propia cadena de formato sin tener que usar varios pasos.

Console.WriteLine(string.Format(string.Format("{{0:0.{0}}}", new string('0', iPlaces)), dValue)) 

En los pasos

//Set the value to be shown 
decimal dValue = 1.7733222345678M; 

//Create number of decimal places 
int iPlaces = 6; 

//Create a custom format using the correct number of decimal places 
string sFormat = string.Format("{{0:0.{0}}}", new string('0', iPlaces)); 

//Set the resultant string 
string sResult = string.Format(sFormat, dValue); 
0

Método para hacer eso:

private static string FormatDecimal(int places, decimal target) 
     { 
      string format = "{0:0." + string.Empty.PadLeft(places, '0') + "}"; 
      return string.Format(format, target); 
     } 
Cuestiones relacionadas