2010-05-02 7 views
33

Ich muss mehrere Währungen in SQL Server speichern. Ich verstehe, dass SQL nicht alle verschiedenen Arten von Währungen unterstützt (es sei denn, ich speichere es als String, aber das möchte ich nicht).Konvertieren Sie alle Währungszeichenfolge in doppelte

Meine Idee war, alle Werte aus ihrem Währungsformat in ein Standard-Double zu konvertieren und das stattdessen zu speichern. Dann neu formatieren basierend auf den Kulturinformationen beim Anzeigen. Ich habe jedoch versucht, etwas wie z.B.

var cultureInfo = new System.Globalization.CultureInfo("en-US"); 
double plain = return Double.Parse("$20,000.00", cultureInfo); 

Das ist nicht immer scheint es immer ein FormatException wirft zu arbeiten. Selbst das Entfernen des Währungssymbols und das alleinige Versuchen, dies allein anhand der Zahl zu tun, macht dasselbe. Dies ist nur ein Beispiel, ich möchte so ziemlich jede Art von Währung unterstützen.

Gibt es eine Standardmethode, um Währungen auszugeben und den Wert doppelt zu erhalten?

+2

Sie möchten die Währung nicht doppelt speichern. Zum Beispiel können Sie 0,01 nicht genau speichern. Verwenden Sie ein Dezimalformat. – staticsan

+0

@statiscan - Ich habe die Datenbank nicht lange nach dieser Frage aktualisiert, um Dezimalzahlen zu verwenden. – James

Antwort

87

ich denke, das sollte funktionieren:

double.Parse(currencyValue, NumberStyles.Currency); 

Hier können Sie mehr über die NumberStyles sehen.

Edit: Falls jemand diese Antwort sieht, ohne auf die anderen Antworten/Kommentare zu suchen, beantwortet diese Antwort auf die Frage, wie geschrieben, aber die Speicherung Währung als double ist keine gute Idee, und es wäre besser, decimal zu verwenden, anstatt .

+6

Ja, oder 'double.Parse (currencyValue, NumberStyles.Currency, cultureInfo') für eine bestimmte Kultur. – Noldorin

+0

@ho: Verdammt, ich war ursprünglich in "NumberStyles.Any". War in der Nähe .... danke. – James

+2

Nicht eine ideale Lösung, Pfundzeichen (zum Beispiel) wird nicht geparst, wenn das aktuelle Gebietsschema ist en-US –

19

Sie sollten Number an die Parse-Funktion

Decimal.Parse("$20,000.00", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, new CultureInfo("en-US")); 

ein paar andere Dinge, für Währungen gebe ich Ihnen Dezimal verwenden würde vorschlagen. Und das könnte weit weg sein, aber es könnte besser sein, die Währungsdaten als Geld in der Datenbank zu speichern und einen Währungscode hinzuzufügen, um die Währung des Werts zu identifizieren.

Ja, und die Antworten vorschlagen NumberStyles.Currency, die besser wäre. Es ist ein Pre-Or'd-Wert, wenn Sie immer noch denken, dass Sie die Strings verwenden möchten.

+1

Ich benutzte zur Zeit 'float' als DB-Typ? Ist das keine gute Idee? – James

+0

@Chris: Grund, dass die Spalte andere Informationen enthält, d. H. Nicht alles, was gespeichert wird, ist monetär, wäre es trotzdem sicher, nicht-monetäre Werte unter Verwendung dieses Typs zu speichern? – James

+0

@James, in der Regel denke ich nicht, dass das Speichern verschiedener Arten von Daten in einem Feld gut ist, aber natürlich kenne ich Ihr Design nicht und Sie haben vielleicht einen guten Grund.Also, ich biete diesen Rat an, ich nehme an, Sie haben einen Indikator, der den Datentyp im Feld anzeigt? Ich schlage vor, dass Sie die numerischen Werte mit einem konsistenten Invariant-Kultur-String-Format speichern und anhand des Indikators entscheiden, ob Sie die Daten präsentieren möchten. So können Sie die Daten immer extrahieren und konsistent in numerisch/dezimal konvertieren und dann über die Präsentation entscheiden, wenn Sie die Daten präsentieren müssen. –

Verwandte Themen