C # Double – ToString () – Formatierung mit zwei Dezimalstellen, aber ohne Rundung

Wie formatiere ich ein Double zu einem String in C #, um nur zwei Dezimalstellen zu haben?

Wenn ich String.Format("{0:0.00}%", myDoubleValue) die Zahl gerundet und ich möchte eine einfache Kürzung ohne Rundung. Ich möchte auch, dass die Konvertierung in String kultursensitiv ist.

Ich benutze folgendes:

 double x = Math.Truncate(myDoubleValue * 100) / 100; 

Zum Beispiel:

Wenn die Nummer 50,947563 lautet und Sie Folgendes verwenden, geschieht Folgendes:

 - Math.Truncate(50.947563 * 100) / 100; - Math.Truncate(5094.7563) / 100; - 5094 / 100 - 50.94 

Und da ist deine Antwort abgeschnitten, jetzt zum Formatieren der Zeichenkette einfach folgendes tun:

 string s = string.Format("{0:N2}%", x); // No fear of rounding and takes the default number format 

Das Folgende rundet die Zahlen ab, aber zeigt nur bis zu 2 Dezimalstellen an (alle nachfolgenden Nullen werden entfernt), dank .## .

 decimal d0 = 24.154m; decimal d1 = 24.155m; decimal d2 = 24.1m; decimal d3 = 24.0m; d0.ToString("0.##"); //24.15 d1.ToString("0.##"); //24.16 (rounded up) d2.ToString("0.##"); //24.1 d3.ToString("0.##"); //24 

http://dobrzanski.net/2009/05/14/c-decimaltostring-and-how-to-get-rid-of-trailing-zeros/

Ich schlage vor, dass Sie zuerst abschneiden und dann formatieren:

 double a = 123.4567; double aTruncated = Math.Truncate(a * 100) / 100; CultureInfo ci = new CultureInfo("de-DE"); string s = string.Format(ci, "{0:0.00}%", aTruncated); 

Verwenden Sie die Konstante 100 für 2 Ziffern abgeschnitten; Verwenden Sie eine 1 gefolgt von so vielen Nullen wie Ziffern nach dem Komma, die Sie möchten. Verwenden Sie den Kulturnamen, den Sie zum Anpassen des Formatierungsergebnisses benötigen.

Einfachste Methode, verwenden Sie numerische Formatzeichenfolgen:

 double total = "43.257" MessageBox.Show(total.ToString("F")); 

Ich benutze price.ToString("0.00") um die führenden 0s zu bekommen

Das funktioniert für mich

 string prouctPrice = Convert.ToDecimal(String.Format("{0:0.00}", Convert.ToDecimal(yourString))).ToString(); 

Die c # -function, wie sie von Kyle Rozendo ausgedrückt wird:

 string DecimalPlaceNoRounding(double d, int decimalPlaces = 2) { d = d * Math.Pow(10, decimalPlaces); d = Math.Truncate(d); d = d / Math.Pow(10, decimalPlaces); return string.Format("{0:N" + Math.Abs(decimalPlaces) + "}", d); } 

Wie wäre es mit einer zusätzlichen Dezimalzahl, die gerundet und dann verworfen werden soll:

 var d = 0.241534545765; var result1 = d.ToString("0.###%"); var result2 = result1.Remove(result1.Length - 1); 

Ich weiß, das ist ein alter Faden, aber ich musste es einfach machen. Während die anderen Ansätze hier funktionieren, wollte ich einen einfachen Weg, um viele Aufrufe von string.format zu string.format . Das Hinzufügen von Math.Truncate zu allen Anrufen war also nicht wirklich eine gute Option. Auch wenn einige Formatierungen in einer database gespeichert sind, ist es sogar noch schlimmer geworden.

Daher habe ich einen benutzerdefinierten Formatanbieter erstellt, mit dem ich der Formatierungszeichenfolge Abschneidung hinzufügen kann, z. B .:

 string.format(new FormatProvider(), "{0:T}", 1.1299); // 1.12 string.format(new FormatProvider(), "{0:T(3)", 1.12399); // 1.123 string.format(new FormatProvider(), "{0:T(1)0,000.0", 1000.9999); // 1,000.9 

Die Implementierung ist ziemlich einfach und kann leicht auf andere Anforderungen erweitert werden.

 public class FormatProvider : IFormatProvider, ICustomFormatter { public object GetFormat(Type formatType) { if (formatType == typeof (ICustomFormatter)) { return this; } return null; } public string Format(string format, object arg, IFormatProvider formatProvider) { if (arg == null || arg.GetType() != typeof (double)) { try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } if (format.StartsWith("T")) { int dp = 2; int idx = 1; if (format.Length > 1) { if (format[1] == '(') { int closeIdx = format.IndexOf(')'); if (closeIdx > 0) { if (int.TryParse(format.Substring(2, closeIdx - 2), out dp)) { idx = closeIdx + 1; } } else { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } } double mult = Math.Pow(10, dp); arg = Math.Truncate((double)arg * mult) / mult; format = format.Substring(idx); } try { return HandleOtherFormats(format, arg); } catch (FormatException e) { throw new FormatException(string.Format("The format of '{0}' is invalid.", format)); } } private string HandleOtherFormats(string format, object arg) { if (arg is IFormattable) { return ((IFormattable) arg).ToString(format, CultureInfo.CurrentCulture); } return arg != null ? arg.ToString() : String.Empty; } } 

Folgendes kann nur für die Anzeige verwendet werden, die die Eigenschaft String verwendet.

 double value = 123.456789; String.Format("{0:0.00}", value); 

Um zu sehen, was es wert ist, um die Währung anzuzeigen, können Sie "C" :

 double cost = 1.99; m_CostText.text = cost.ToString("C"); /*C: format as currentcy */ 

Ausgabe: $1.99

Du könntest auch deinen eigenen IFormatProvider schreiben, obwohl ich denke , dass du irgendwann einen Weg finden musst, die eigentliche Kürzung durchzuführen .

Das .NET Framework unterstützt auch benutzerdefinierte Formatierung. Dies beinhaltet normalerweise die Erstellung einer Formatierungsklasse, die sowohl IFormatProvider als auch ICustomFormatter implementiert . (msdn)

Zumindest wäre es leicht wiederverwendbar.

Es gibt einen Artikel darüber, wie Sie hier Ihren eigenen IFormatProvider / ICustomFormatter bei CodeProject implementieren . In diesem Fall ist es vielleicht am besten, ein bestehendes numerisches Format zu “erweitern”. Es sieht nicht so schwer aus.

Ich hatte dieses Problem mit Xamarin und getriggers mit:

 porcent.ToString("0.##"+"%")