2010-07-16 10 views
11

Ich habe es mit vielen verschiedenen Währungen in meiner Anwendung zu tun, und ich möchte wissen, was der "beste" Weg ist, sie in einer SQLite3-Datenbank zu speichern.Währungswerte in SQLite3 speichern

Ich lehne mich an eine Festkommadarstellung (d. H. Speichern Sie sie als Ganzzahlen, wobei $ 3.59 als 359 gespeichert wird, ¥ 400 als 40000 gespeichert). Ist das eine gute Idee? Was ist, wenn sich meine Eingabedaten später ändern und mehr Präzision erfordern?

Antwort

18

Vorausgesetzt, dass SQLite 3 bis zu 8 Bytes verwendet, um INTEGER Typen zu speichern, es sei denn, Sie haben Zahlen größer als 10^16, sollten Sie in Ordnung sein.

Um dies zu relativieren, ist das weltweite Bruttoinlandsprodukt, ausgedrückt in Tausendstel USD (eine Mühle), etwa 61'000'000'000'000'000, was sqlite3 problemlos ausdrücken kann.

sqlite> create table gdp (planet string, mills integer); 
sqlite> insert into gdp (planet, mills) values ('earth', 61000000000000000000); 
sqlite> select * from gdp; 
earth|61000000000000000000 

Sofern Sie interplanetarische Buchhaltung behandeln, denke ich nicht, dass Sie sich sorgen müssen.

+1

Man muss alle Möglichkeiten berücksichtigen ... ;-) Danke! – nornagon

+10

Nun, um ganz genau zu sein, berücksichtigt dies nicht alle Eventualitäten: http://en.wikipedia.org/wiki/File%3AZimbabwe_%24100_trillion_2009_Obverse.jpg – msw

0

Ich würde String/Text sagen. Sie können es immer in eine beliebige Kultur konvertieren, wenn Sie dies auch tun müssen.

+3

Speichern von numerischen Daten als Zeichenfolgen ist dumm, vor allem, wenn es ein vollkommen feiner numerischer Typ, der den Anwendungsfall unterstützt. –

1

In der Finanzsoftware wird die Währung immer als Fixpunkt (dezimal) dargestellt. Sie können es in SQLite mit Ganzzahlen emulieren (64-Bit-Integer hält bis zu 18 Ziffern).

0

beste Währung Datentyp ist BigDecimal und in SQLite Sie es als VARCHAR Feld speichern kann

ormlite BigDecimal in String zu konvertieren, wenn Sie es speichern.

ormlite doc for BigDecimal

-3

SQLite hat keine BigDecimal Feld So verwende ich die SQLite Integer-Typ und wandeln wie so: BigDecimal bd = new BigDecimal ("1234.5678"); int gepackteInt = bd.scaleByPowerOfTen (4) .intValue(); // packedInt jetzt = 12345678 Speichern Sie jetzt packedInt in SQLite Integer-Feld. Um zu BigDecimal zurückzukehren: BigDecimal bd = new BigDecimal (packedInt); // bd = 12345678 bd = bd.scaleByPowerOfTen (-4); // jetzt bd = 1234.5678

+0

Bitte posten Sie [identische Antworten] (http://stackoverflow.com/a/39626427/5292302) nicht auf mehrere Fragen. Schreibe eine gute Antwort, dann vote/flag, um die anderen Fragen als Duplikate zu schließen. Wenn die Frage kein Duplikat ist, * schneide deine Antworten auf die Frage. * –