416 Stimmen

Verwendung von String Format zur Anzeige von Dezimalzahlen mit bis zu 2 Stellen oder einfachen Ganzzahlen

Ich habe ein Preisfeld anzuzeigen, die manchmal entweder 100 oder 100,99 oder 100,9 sein kann, was ich will, ist der Preis in 2 Dezimalstellen nur anzeigen, wenn die Dezimalstellen für diesen Preis eingegeben werden, zum Beispiel, wenn seine 100 so sollte es nur zeigen 100 nicht 100,00 und wenn der Preis 100,2 sollte es 100,20 ähnlich für 100,22 sollte gleich sein anzeigen. Ich habe gegoogelt und bin auf einige Beispiele gestoßen, aber sie entsprachen nicht genau dem, was ich wollte:

// just two decimal places
String.Format("{0:0.00}", 123.4567);      // "123.46"
String.Format("{0:0.00}", 123.4);         // "123.40"
String.Format("{0:0.00}", 123.0);         // "123.00"

717voto

Gh61 Punkte 8377

Entschuldigen Sie, dass ich diese Frage reaktiviere, aber ich habe hier nicht die richtige Antwort gefunden.

Bei der Formatierung von Zahlen können Sie Folgendes verwenden 0 als obligatorischer Ort und # als fakultativen Ort.

Ainsi :

// just two decimal places
String.Format("{0:0.##}", 123.4567);      // "123.46"
String.Format("{0:0.##}", 123.4);         // "123.4"
String.Format("{0:0.##}", 123.0);         // "123"

Sie können auch kombinieren 0 con # .

String.Format("{0:0.0#}", 123.4567)       // "123.46"
String.Format("{0:0.0#}", 123.4)          // "123.4"
String.Format("{0:0.0#}", 123.0)          // "123.0"

Hierfür wird immer die Formatierungsmethode verwendet CurrentCulture . Für einige Kulturen . wird geändert in , .

Antwort auf die ursprüngliche Frage:

Die einfachste Lösung stammt von @Andrew ( aquí ). Ich persönlich würde also etwas wie dieses verwenden:

var number = 123.46;
String.Format(number % 1 == 0 ? "{0:0}" : "{0:0.00}", number)

178voto

Uwe Keim Punkte 38139

Eine unelegante Art und Weise wäre das:

var my = DoFormat(123.0);

Mit DoFormat so etwas wie:

public static string DoFormat( double myNumber )
{
    var s = string.Format("{0:0.00}", myNumber);

    if ( s.EndsWith("00") )
    {
        return ((int)myNumber).ToString();
    }
    else
    {
        return s;
    }
}

Das ist nicht elegant, hat aber bei mir in ähnlichen Situationen bei einigen Projekten funktioniert.

97voto

detale Punkte 11524

Dies ist ein häufiger Anwendungsfall für die Formatierung von Gleitkommazahlen.

Leider können alle eingebauten einbuchstabigen Formatzeichenfolgen (z. B. F, G, N) dies nicht direkt erreichen.
Zum Beispiel, num.ToString("F2") wird immer 2 Dezimalstellen anzeigen, wie 123.40 .

Sie müssen Folgendes verwenden 0.## Muster, auch wenn es ein wenig langatmig aussieht.

Ein vollständiges Code-Beispiel:

double a = 123.4567;
double b = 123.40;
double c = 123.00;

string sa = a.ToString("0.##"); // 123.46
string sb = b.ToString("0.##"); // 123.4
string sc = c.ToString("0.##"); // 123

69voto

Andrew Punkte 6990

Eine alte Frage, aber ich wollte die meiner Meinung nach einfachste Möglichkeit hinzufügen.

Ohne Tausende von Separatoren:

value.ToString(value % 1 == 0 ? "F0" : "F2")

Mit Tausende von Separatoren:

value.ToString(value % 1 == 0 ? "N0" : "N2")

Das Gleiche, aber mit String.Format :

String.Format(value % 1 == 0 ? "{0:F0}" : "{0:F2}", value) // Without thousands separators
String.Format(value % 1 == 0 ? "{0:N0}" : "{0:N2}", value) // With thousands separators

Wenn Sie es brauchen in viele Orte würde ich diese Logik in einem Erweiterungsmethode :

public static string ToCoolString(this decimal value)
{
    return value.ToString(value % 1 == 0 ? "N0" : "N2"); // Or F0/F2 ;)
}

31voto

Yahia Punkte 68137

Versuchen Sie

double myPrice = 123.0;

String.Format(((Math.Round(myPrice) == myPrice) ? "{0:0}" : "{0:0.00}"), myPrice);

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X