2 Stimmen

C# Double - ToString Formatierung, um einen Wert in Cents ohne Dezimalstellen anzuzeigen

Ich habe eine Situation, in der ich einen doppelten Wert anzeigen muss, der auf zwei Dezimalstellen gerundet ist, aber ohne die Dezimalstelle angezeigt wird. Es wird einige Situationen geben, in denen ich denselben Code verwenden und den doppelten Wert anders anzeigen möchte, daher hatte ich gehofft, dass ich dies durch die Übergabe eines Stringformatmusters handhaben kann.

Der doppelte Wert könnte zum Beispiel sein: 11367.2232 Der Wert soll lauten: 1136722

Ein anderes Beispiel: Der Wert könnte 344576.3457 sein. Ich möchte, dass der Wert 34457635 lautet.

Ein drittes Beispiel: Der Wert könnte 546788 sein. Ich möchte, dass der Wert 54678800 lautet.

Deshalb möchte ich Folgendes tun:

String.Format("{PATTERN}", dblCurrency);

Gibt es ein Formatierungsmuster, das sowohl auf 2 Dezimalstellen rundet als auch die Dezimalstelle aus der Anzeige entfernt?

19voto

LBushkin Punkte 124894

Erste mit (sehr) wenigen Ausnahmen, ist es generell schlechte Idee zu verwenden double für die Manipulation von Währungswerten . Sie sollten wirklich verwenden decimal um diese Beträge darzustellen.

Zweite Bei der Rundung und der Formatierung der Anzeige handelt es sich um getrennte Vorgänge, die in Ihrem Code separat ausgedrückt werden sollten. string.Format() bietet keine einzige Formatmaske, die beides kann, aber Sie können leicht erreichen, was Sie wollen:

decimal amount = 11367.3456m
String.Format( "{0:0}", amount*100 );

was zu einer Ausgabe führt:

1136735

El D0 Formatbezeichner gibt numerische Werte ohne Trennzeichen und ohne Nachkommastellen aus. Sie könnten auch einfach ToString() aber ich denke, dass der Format-Spezifizierer die Absicht deutlicher vermittelt.

0voto

Byron Sommardahl Punkte 12363

Verwenden Sie dies:

var dblCurrency = 11367.2232D;
var rounded = Math.Round(dblCurrency, 2);
var cents = rounded*100;
var centString = cents.ToString();

0voto

Jason Williams Punkte 55292

Sie könnten eine benutzerdefinierte Formatierungsfunktion wie diese verwenden:

string ScaledFormat(string format, double value, double scaleFactor)
{
    return(string.Format(format, Math.Round(value * scalefactor, 0)));
}

oder, wenn Sie nur ein paar Formatvorlagen haben, würde ich ein Enum verwenden:

enum CustomFormat { Integer, IntegerX100 };
string ScaledFormat(CustomFormat format, double value)
{
    switch(format)
    {
        case CustomFormat.Integer:     return(string.Format("{0}", (int) value);
        case CustomFormat.IntegerX100: return(string.Format("{0}", Math.Round(value * 100.0, 0));
    }
}

Das bedeutet, dass es eine bestimmte Anzahl von Möglichkeiten gibt, wie der Wert formatiert werden kann, und dass die eigentliche Konvertierung vollständig in der Methode gekapselt ist, wodurch eine konsistente Ausgabe im gesamten Programm gewährleistet wird und vermieden wird, dass überall "magische Konstanten" verstreut werden. Außerdem wird die Formatierung zentralisiert, so dass Sie sie in Zukunft leicht anpassen können, ohne Hunderte verschiedener string.Format-Aufrufe finden und korrigieren zu müssen. Außerdem wird der Testaufwand reduziert, da Sie nur ein kleines Stück gut getesteten Codes wiederverwenden. Und es macht die Fälle, in denen Sie die Zeichenkette formatieren, viel einfacher zu lesen/verstehen (selbstdokumentierender Code).

0voto

Seb Punkte 3384

Um das zu erreichen, was Sie brauchen, versuchen Sie etwas wie:

decimal dNumber = 11367.2232;
String.Format( "{0:0}", Math.Round(amount, 2) * 100));

Dies sollte 1136722 ergeben.

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