2009-04-14 6 views
7

Comment puis-je formater un nombre à un nombre fixe de décimales (garder les zéros de fin) où le nombre de places est spécifié par une variable?Comment formater un nombre décimal en un nombre de décimales contrôlé par programme dans C#?

par exemple.

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) 

Notez que depuis que je veux contrôler le nombre de places programatically, ce string.Format ne fonctionnera pas (je devrais sûrement pas générer la chaîne de format):

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

Dois-je simplement inclure Microsoft.VisualBasic et utilisez FormatNumber? J'aurais manqué quelque chose d'évident ici, je l'espère.

Répondre

12

Essayez

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. 

espère que cela fonctionne pour vous. Voir

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

pour plus d'informations. Si vous trouvez le annexant un peu essayer aki:

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

Ensuite, vous pouvez simplement appeler

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

Comment puis-je spécifier le nombre de décimales comme une variable? Je suppose que je pourrais faire (1.2M) .ToString ("D" + x) mais cela semble un peu hacky –

+0

Eh bien, vous pouvez toujours l'activer dans une méthode d'extension. –

+0

Ça grandit sur moi, merci pour la méthode d'extension, aussi. –

2

Voir ces liens pour l'aide de chaîne de format:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Vous souhaitez que cette :

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

De plus, l'appel .ToString arrondira pour vous si nécessaire pour que vous puissiez sauter le Math.Round appel et faire ceci:

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

OK, donc la génération de la chaîne de format ("F" + x.ToString()) est l'astuce, alors? J'ai supposé que je manquais juste une bibliothèque. Merci, Joel! –

+0

Mais ...vous avez décrit exactement la même chose dans les commentaires de la réponse ci-dessus que "hacky"? –

+0

Une fois c'est un hack. Deux fois est une bonne pratique.

1

Quelque chose comme cela devrait gérer:

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

Try this créer dynamiquement votre propre chaîne de format sans avoir à utiliser plusieurs étapes.

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

Dans les étapes

//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éthode de le faire:

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