2012-03-29 10 views
1

Ich versuche, etwas sehr ähnlich this c# docs example tun:Zahlenformatierung in C# - getrennt int und Dezimalstellen

int value = 123; 
Console.WriteLine(value.ToString(@"\#\#\# ##0 dollars and \0\0 cents \#\#\#")); 
// Displays ### 123 dollars and 00 cents ### 

Außer ich will es mit Dezimalzahlen tatsächlich arbeitet:

double value = 123.095; 
Console.WriteLine(value.ToString(@"\#\#\# ##0 dollars and 0000 \#\#\#")); 
// Should display ### 123 dollars and 0950 ###, but it doesn't (of course) 

versucht:

Console.WriteLine(value.ToString(@"\#\#\# ##0. dollars and 0000 cents \#\#\#")); 

Aber druckt das Dezimaltrennzeichen (natürlich), die ich nicht will.
Ich weiß, dass ich etwas tun könnte:

String.Format("{0:##0} {1:0000}", 123, 123); 

Aber möchte sehr viel zu vermeiden, es sei denn, es keine andere Möglichkeit ist

+7

'int value = 123,123;' Sie wirklich nicht zu tun, dass :) – Reniuz

+1

@Reniuz falsch copy/paste, offensichtlich. – Razor

+1

123,095 ist $ 123,00 Dollar und abhängig davon, wie Sie den Wert zwischen '09,5' Cent und' 10,00' Cent bestimmen .... es ist sicherlich nicht '0950' Cent basierend auf dem Kommentar. Ich muss diese Frage immer noch wegen der Menge der Fehler, die behoben werden mussten, ablehnen. –

Antwort

2

Sie können definieren Sie Ihre eigenen speziellen Währungsformat, aber ... Ich bin mir nicht sicher, ob ich das tun würde. Es Art scheint wie ein Missbrauch des Number Objekt:

EDIT: geändert Datentyp Wert von dezimal

// works with either decimal or double 
double value = 123.095; 

var mySpecialCurrencyFormat = new System.Globalization.NumberFormatInfo(); 

mySpecialCurrencyFormat.CurrencyPositivePattern = 3; 
mySpecialCurrencyFormat.CurrencyNegativePattern = 8; 
mySpecialCurrencyFormat.NegativeSign = "-"; 
mySpecialCurrencyFormat.CurrencySymbol = "cents"; 
mySpecialCurrencyFormat.CurrencyDecimalDigits = 4; 
mySpecialCurrencyFormat.CurrencyDecimalSeparator = " dollars and "; 
mySpecialCurrencyFormat.CurrencyGroupSeparator = ","; 
mySpecialCurrencyFormat.CurrencyGroupSizes = new[] { 3 }; 


Console.WriteLine(value.ToString("C", mySpecialCurrencyFormat)); 

Ausgang ist „123 Dollar und 0950 Cent“

EDIT zu verdoppeln: es könnte Sinnvoller ist es, CurrencyNegativePattern 15 anstelle von 8 zu verwenden, sodass negative Werte dazu führen, dass die gesamte Zeichenfolge von Klammern umgeben ist, was weniger verwirrend sein kann, als nur ein negatives Vorzeichen vor die Dollars zu setzen. Wenn Sie beispielsweise CurrencyNegativePattern = 15 verwenden, wird -123.095 als "(123 US-Dollar und 0950 Cent)" ausgegeben.

+0

Ich glaube nicht, dass dies richtig ist, da es nur 9,5 Cent statt 950 Cent ist. Aber ich genieße deinen Missbrauch eines Zahlformatiers. – user7116

+0

@sixlettervariables - :) Danke, dass du auf die 0950 Cent hingewiesen hast ... obwohl es das ist, wonach das OP gefragt hat, scheint es seltsam. –

+0

Wenn das OP etwas wie Ausgabe "123 Dollar und 09.50 Cent" machen wollte, dann würde ich denken, dass diese Antwort zusammenbrechen würde, weil ich keine Möglichkeit sehe, "Gruppierung" für den Dezimalteil einer Zahl mit NumberFormatInfo bereitzustellen. –

1

Sie keine korrekte Trennung unter Verwendung von Composite-Formatierung in .Net erreichen können.

decimal value = 123.23m; 

Console.WriteLine(
    @"{0:0} dollars and {1:#0} cents", 
    Math.Truncate(value),     // Dollars 
    (value - Math.Truncate(value)) * 100m // Cents 
); 

// Output: 123 dollars and 23 cents 

Als Nebenwirkung, die Sie nie Geld float oder double zu speichern verwenden sollten, es sei denn, Sie IEEE-754 wollen Modi runden Ihr Geld zu stehlen oder führen Sie zu: Sie werden die Teile auf eigene Faust trennen müssen schulde mehr.

+0

Dies scheint die einzig richtige Antwort auf die Frage des Autors zu sein. –

+0

Kann 'Dezimal' nicht in meinem Fall verwenden. Schade, dass ich auch keine Composite-Formatierung verwenden kann - danke. – Razor

+0

Vorsicht mit negativen Werten –

0

Schreiben Sie ein Programm, in dem der Benutzer eine reelle Zahl wie 12,842 eingibt und dann den ganzzahligen Teil und den Dezimalteil ausgibt während der Verwendung von Typcasting, um die erforderliche Operation durchzuführen. Ausgang würde in etwa so aussehen: Der ganzzahlige Teil ist: 12 Der Dezimalteil ist: 842

Verwandte Themen