2010-03-16 11 views
112

Wie formatiere ich eine Double zu einem String in C#, um nur zwei Dezimalstellen zu haben?C# Double - ToString() - Formatierung mit zwei Dezimalstellen, aber keine Rundung

Wenn ich String.Format("{0:0.00}%", myDoubleValue) verwende, ist die Zahl dann gerundet und ich möchte eine einfache abgeschnitten ohne Rundung. Ich möchte auch die Umwandlung zu String kultursensitiv sein.

+0

Was meinen Sie mit " kultursensibel "? Bedeutet das, dass das Ergebnis der Formatierung abhängig von einem von einem Programmierer bereitgestellten Kulturwert variieren muss? Oder möchten Sie die Kultur verwenden, die standardmäßig für den aktuellen Thread verwendet wird? – CesarGon

Antwort

152

Ich verwende den folgenden:

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

Zum Beispiel:

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

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

Und es ist Ihre Antwort abgeschnitten, um nun die Zeichenkette zu formatieren, gehen Sie einfach wie folgt vor:

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

-1 Sie können die kultursensitive Formatierung im selben 'string.Format'-Schritt ausführen, der die Zeichenfolge formatiert. Siehe meine Antwort unten. – CesarGon

+0

Genau: Das Poster fragt nach einer Lösung, die eine kultursensitive Formatierung beinhaltet. Ihre Antwort ist in dem abgeschnittenen Teil vollkommen in Ordnung, aber, wie Sie gut darauf hinweisen, "die Kulturänderung müsste separat durchgeführt werden". Sie geben nicht an, wie Sie es tun sollen, daher denke ich, dass Ihre Antwort nur teilweise auf die Frage antwortet. – CesarGon

+2

Alles klar, ich werde einfach einen Nachtrag posten. –

30

Ich schlage vor, Sie gestutzt zuerst, und dann Format:

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 Stellen gestutzt; 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.

0

Sie könnten auch Ihre eigenen IFormatProvider schreiben, obwohl ich denke, schließlich müssten Sie über eine Möglichkeit denken, die tatsächliche Kürzung zu tun.

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 Ihren eigenen IFormatProvider/ICustomFormatter here at CodeProject implementieren. In diesem Fall ist es vielleicht am besten, ein bestehendes numerisches Format zu "erweitern". Es sieht nicht so schwer aus.

5

Dies ist für mich arbeiten

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

Die Funktion C#, ausgedrückt als durch Kyle Rozendo:

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); 
} 
64
decimal d = 0.241534545765m; 
decimal d2 = 0.241m; 
decimal d3 = 0.2m; 

d.ToString("0.##%");  //24.15% 
d2.ToString("0.##%");  //24.1% 
d3.ToString("0.##%");  //20% 

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

+7

Dies funktioniert nicht. Versuchen Sie es mit 0,2415999. Diese Lösung rundet, nicht abschneidet. – BJury

+2

Wow, so viele Stimmen und trotzdem Rundungen. Es kann notwendig sein, darauf hinzuweisen, dass die Rundung auf die nächste gewünschte Dezimalstelle zuläuft, während das Abschneiden nach der nächsten Kommastelle erfolgt. – mysticcoder

+0

@mysticcoder Ich denke, meine Antwort bekommt so viele Upvotes, weil sie in einer Google-Suche auf die ops-Frage kommen, wie ich es getan habe, um nachgestellte Nullen zu entfernen und nicht nach dem Rundungswunsch der Ops-Frage zu suchen. Ich denke, ich sollte meine Antwort löschen ... –

2

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

So machte ich einen benutzerdefinierten Format-Provider, die mir das Abschneiden die Formatierungszeichenfolge hinzufügen würde es ermöglichen, zum Beispiel:

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 ist leicht erweiterbar auf andere Anforderungen.

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; 
    } 
} 
7

i verwenden price.ToString("0.00") für das Erhalten der führenden 0s

10

Simplest Methode verwenden numerische Format-Strings:

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

Eigentlich ist diese Methode rund https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx#FFormatString – elvin

1

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

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

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

var d = 0.241534545765; 
var result1 = d.ToString("0.###%"); 

var result2 = result1.Remove(result1.Length - 1); 
+1

Es ist lustig, wie eine nicht funktionierende Antwort hat 60 Abstimmungen (ab heute), und diese ziemlich einfache und kugelsichere Lösung hat nur einen .... –

+0

Dies funktioniert nicht in dem Fall, dass die Rundung mehr als eine Ziffer über dem Cutoff beeinflusst. Zum Beispiel wird 0.199999 als 0,20 mit diesem Code anstelle von 0,19 enden. – Bernem

0

Um was wert ist, für Währung angezeigt, können Sie "C" verwenden:

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

Ausgang: $1.99

Verwandte Themen