Nullen hinter dem Komma bei decimal abschneiden
-
Wie bekomme ich es hin, dass bei decimal.ToString die Nullen hinter dem Komma weggeschnitten werden?
Wichtig: Ich will nicht runden. Wenn die Zahl 12.4368 lautet, dann soll sie auch als String "12.4368" lauten. Aber wenn eine Zahl 12.4360 lautet, dann soll eine der ToString-Funktionen daraus "12.436" machen. Und 12.0000 soll zu "12" werden.
-
Hallo,
dazu habe ich folgende Methode:
/// <summary> /// Normalize a decimal value (remove trailing zeros (0)) /// e.g. Normalize(1.23000) -> 1.23 /// </summary> /// <param name="value">the decimal value to normalize</param> /// <returns>normalized value</returns> internal static decimal Normalize(decimal value) { return value / 1.000000000000000000000000000000000m; }
-
String.Format("{0:.####}", deineZahl)
Eine Anforderung wird nicht ganz erfüllt, nämlich das Runden.
BeiString.Format("{0:.####}", 12.12348)
kommt nämlich "12,1235" als Ergebnis.
Edit: Code-Tags
-
decimal d = 12.4360m; string s = d.ToString(); var split = s.Split('.', ','); if (split.Length > 1) s = split[0] + "." + split[1].TrimEnd('0');
-
Den Fall 12.000 habe ich vergessen:
decimal d = 12.000m; string s = d.ToString(); var split = s.Split('.', ','); if (split.Length > 1) if (split[1].All(c => c == '0')) s = split[0]; else s = split[0] + "." + split[1].TrimEnd('0');
-
Gibt's da keine saubere, vom .NET-Framework vorgesehene Möglichkeit statt dieses ganze Rumfrickeln?
-
Nicht dass ich wüsste, aber wenn du bei meiner Methode eine Nachkommastelle mehr als nötig in den Formatstring nimmst und diese hinterher dann verwirfst, hast du das Runden auch erledigt.
-
Der Fonz schrieb:
Gibt's da keine saubere, vom .NET-Framework vorgesehene Möglichkeit statt dieses ganze Rumfrickeln?
Pack die Frickelei in eine Funktion, teste sie ausgiebig, lagere sie in eine Util-DLL aus. Anders macht es das Framework auch nicht
-
Meine Lösung ist doch sauber:
decimal d = 12.3400000m; string s = Normalize(d).ToString(); // => 12.34
-
Decimal val = 12.4368m; Console.WriteLine("{0}", Decimal.Truncate(val*1000) /1000); Console.WriteLine("{0}", Decimal.Round(val - 0.0005m, 3, MidpointRounding.AwayFromZero));
-
Th69 hat echt eine gute Lösung obwohl ich nicht raffe, warum sie funktioniert.
loks und GPC gehen von fester Stellenzahl aus ... naja.
-
Die Lösung habe ich von Remove trailing zeros?
-
Vielleicht dürfte auch noch die andere Antwort in dem Thread auf Stackoverflow sinnvoll sein:
http://stackoverflow.com/a/9391762Vor allem weil das die einzige Lösung ist, welche keinerlei Tricks verwendet. Das mit der Division setzt ja auf ein nicht weiter dokumentiertes Verhalten von
Decimal
.12.24500m.ToString("#.#############################");
Oder auch weniger als 29 '#' hinter dem Komma, falls klar ist, dass die Zahlen sowieso nie mehr als x Nachkommastellen haben sollen.
Grüssli