2010-07-16 2 views
11

Я имею дело с множеством разных валют в моем приложении, и я хочу знать, что «лучший» способ хранить их в базе данных SQLite3.Сохранение значений валюты в SQLite3

Я склоняюсь к представлению с фиксированной точкой (т. Е. Сохраняю их как целые числа, где $ 3.59 хранится как 359, ¥ 400 хранится как 40000). Это хорошая идея? Что делать, если мои входные данные позже меняются и требуют большей точности?

ответ

18

Учитывая, что SQLite 3 будет использовать до 8 байтов для хранения типов INTEGER, если у вас не будет чисел больше 10^16, вы должны быть в порядке.

Чтобы представить это в перспективе, мировой валовой внутренний продукт, выраженный в тысячных долях USD (мельница), составляет около 61'000'000'000'000'000, у которого sqlite3 нет проблем с выражением.

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

Если вы не занимаетесь межпланетным бухгалтерией, я не думаю, что вам нужно беспокоиться.

+1

Нужно учитывать все возможности ... ;-) Спасибо! – nornagon

+10

Ну, чтобы быть полностью точным, это не учитывает все возможные события: http://en.wikipedia.org/wiki/File%3AZimbabwe_%24100_trillion_2009_Obverse.jpg – msw

0

Я бы сказал, строка/текст. Вы всегда можете преобразовать его в любую культуру, если вам тоже нужно это сделать.

+3

Хранение числовых данных в виде строк является глупым, особенно когда есть отлично тонкий цифровой тип, поддерживающий прецедент. –

1

В валюте финансового программного обеспечения всегда отображается как фиксированная точка (десятичная). Вы можете эмулировать его в SQLite с помощью целых чисел (64-разрядное целое число вмещает до 18 цифр).

0

лучшая валюта DataType является BigDecimal и в SQLite вы можете сохранить его как VARCHAR поле

ormlite преобразования BigDecimal в строку, когда вы храните его.

ormlite doc for BigDecimal

-3

SQLite не имеет BigDecimal поля Поэтому я использую тип Integer SQLite и преобразовать так: BigDecimal шд = новый BigDecimal ("1234,5678"); int packetInt = bd.scaleByPowerOfTen (4) .intValue(); // packInt now = 12345678 Теперь сохраните packageInt в SQLite целое поле. Чтобы вернуться к BigDecimal: BigDecimal bd = new BigDecimal (упакованныйInt); // bd = 12345678 bd = bd.scaleByPowerOfTen (-4); // now bd = 1234.5678

+0

Пожалуйста, не отправляйте [идентичные ответы] (http://stackoverflow.com/a/39626427/5292302) на несколько вопросов. Отправьте один хороший ответ, затем проголосовате/отметьте, чтобы закрыть другие вопросы как дубликаты. Если вопрос не является дубликатом, * приложите свои ответы на вопрос. * –