2009-04-14 7 views
7

Jak sformatować liczbę do określonej liczby miejsc dziesiętnych (zachować końcowe zera), gdzie liczba miejsc jest określona przez zmienną?Jak sformatować dziesiętny na programowo sterowaną liczbę miejsc po przecinku w języku C#?

np.

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) 

Zauważ, że ponieważ chcę kontrolować liczbę miejsc programowo, to string.Format nie będzie działać (na pewno nie powinien generować ciąg formatu):

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

Mam tylko to Microsoft.VisualBasic i użyć FormatNumber?

Mam nadzieję, że brakuje tu czegoś oczywistego.

Odpowiedz

12

Spróbuj

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. 

nadzieję, że to działa dla Ciebie. Zobacz

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

aby uzyskać więcej informacji. Jeśli uważasz, że dołączanie trochę hacky spróbować:

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

Następnie można po prostu zadzwonić

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

Jak określić liczbę miejsc po przecinku jako zmienną? Przypuszczam, że mógłbym zrobić (1,2M) .ToString ("D" + x), ale to wydaje się trochę hacky. –

+0

Zawsze możesz włączyć to w metodę rozszerzenia. –

+0

To rośnie na mnie, dzięki za metodę rozszerzenia. –

2

zobacz te linki o pomoc format string:
http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

tego chcesz :

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

Dodatkowo, połączenie .ToString będzie zaokrąglić dla Ciebie, jeśli potrzebne więc można pominąć wezwanie Math.Round i po prostu to zrobić:

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

OK, więc generowanie łańcucha formatu ("F" + x.ToString()) to sztuczka? Zakładałem, że po prostu przegapiłem bibliotekę. Dzięki, Joel! –

+0

Ale ...opisałeś dokładnie to samo w komentarzach powyższej odpowiedzi jako "hacky"? –

+0

Raz jest hack. Dwa razy to najlepsza praktyka.

1

Coś jak to powinno go obsługiwać:

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

Wypróbuj dynamicznie tworzyć własny ciąg formatów bez konieczności stosowania wielu kroków.

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

W krokach

//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

metoda, aby to zrobić:

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