2010-01-18 6 views
9

Ich habe Dezimalwert 18.8. Werte, die in dieser Variablen gespeichert sind, können beliebiger Art sein. Zum Beispiel kann es 1,0000000 oder 1,00004000 oder 5,00000008 sein. Ich möchte eine Methode schreiben, so dass ich dezimal übergeben kann und aufgerundete Zeichenfolge erhalten. Dies wäre kein Problem, wenn ich die Dezimalstellen kennen würde, die ich gerne bekommen würde. Aber was ich möchte, ist:Wie komme ich am besten zum Aufrunden von Dezimalzahlen in C#

Wenn es 1.0000000 ist, sollte es zurückgeben 1.
Wenn es 1.00004000 ist, sollte es 1.00004 zurückgeben.
Wenn es 5.00000008 ist, sollte es 5.00000008 zurückgeben. Also im Grunde sollte es alle 0, die hinter der letzten Ziffer diffrent sind, dann 0 finden und es abschneiden.

Wie soll ich es angehen? Was ist die beste Methode? Ich bekomme diesen Wert von SQL und setze ihn in dezimale Variable, aber dann möchte ich es anzeigen und 5.0000000 haben, wenn es als 5 angezeigt werden könnte, ist ein bisschen übertrieben für mich.

Ich hoffe, ich könnte ein paar nette Vorschläge bekommen.

Mit Grüßen,

MadBoy

Antwort

9

AFAIK, ToString ("0. ##") tun, gerade Anzahl von # erhöhen, so dass Ihr Wert wird aufrunden nicht. Zum Beispiel:

decimal d = 1.999m; 
string dStr = d.ToString("0.###"); 

Dies wird "1,999" string erzeugen (Begrenzer hängt von der verwendeten Kultur ab).

Als Ergebnis können Sie allgemeine sehr lange Formatierungszeichenfolge verwenden: "0.############################" - um alle Ihre Werte zu formatieren.

+0

Ich weiß nicht die Anzahl der Dezimalstellen, die ich brauche. Dies würde funktionieren, wenn ich wissen würde, dass ich es nach 3 Ziffern oder mehr abschneiden möchte. Aber ich möchte es nur abschneiden, wenn alle Ziffern Nullen nach dem letzten nicht Null sind. – MadBoy

+1

Wenn Sie 1,00004000 haben, dann haben Sie nach ToString ("0. ####################") "1.00004". Apropos MAX von # Zeichen: es ist 28. Dezimal erlaubt maximal 28-29 von signifikanten Ziffern. Dies macht 1 für führende Null und 28 für andere Zeichen. Selbst wenn Sie wie 15555.98900008900 haben, wird es in Ordnung sein. – terR0Q

+0

Danke, es funktioniert. Ich hätte es testen sollen, bevor ich bezweifle, dass es so funktioniert, wie du es gesagt hast. – MadBoy

2

Also trimmen Sie die Nullen vom Ende.

decimal d = 1.999m; 
string dStr = d.ToString().TrimEnd('0').TrimEnd('.'); 
+0

Und wenn es einen Wert 1.000.000,00 gibt? Dann verliert er alle Nullen, nehme ich an? Oder es bleibt "1.000.000". – Webleeuw

+1

Er verliert nur die Nullen nach dem Punkt (.) Es bleibt der Punkt, aber er könnte einfach ein weiteres 'TrimEnd ('.')' Hinzufügen. Für I18N sollte er nicht den Punkt verwenden, sondern den kulturspezifischen Separator. – Scoregraphic

1

Sie auch string.Format und here's die Dokumentation der verschiedenen möglichen Formaten, aber Ich mag Johan Sheehans cheat sheet mehr als schnelle Referenz verwenden können.

decimal number=4711.00004711m; 
4711.00004711 
string.Format("{0:0.#############}",number); 
"4711,00004711" 
number=42; 
42 
string.Format("{0:0.#############}",number); 
"42"