Сохранение значений валюты в SQLite3
Я имею дело с множеством разных валют в своем приложении, и я хочу знать, что "лучший" способ хранить их в базе данных SQLite3.
Я склоняюсь к представлению с фиксированной точкой (т.е. сохраняю их как целые числа, где $3.59 хранится как 359, ¥ 400 хранится как 40000). Это хорошая идея? Что делать, если мои входные данные позже меняются и требуют большей точности?
Ответы
Ответ 1
Учитывая, что SQLite 3 будет использовать до 8 байтов для хранения типов INTEGER, если у вас не будет чисел больше 10 ^ 16, вы должны быть в порядке.
Чтобы представить это в перспективе, мировой валовой внутренний продукт, выраженный в тысячных тысячах долларов США (мельница), составляет около 61 000 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
Если вы не занимаетесь межпланетным учетным записями, я не думаю, что вам нужно беспокоиться.
Ответ 2
В валюте финансового программного обеспечения всегда отображается как фиксированная точка (десятичная).
Вы можете эмулировать его в SQLite с использованием целых чисел (64-разрядное целое число вмещает до 18 цифр).
Ответ 3
Я бы сказал строку/текст. Вы всегда можете преобразовать его в любую культуру, если вам тоже нужно это сделать.
Ответ 4
лучшая валюта DataType - BigDecimal
, а в sqlite вы можете сохранить ее как поле VARCHAR
ormlite конвертировать BigDecimal в строку при ее сохранении.
ormlite doc для BigDecimal
Ответ 5
SQLite не имеет поля BigDecimal
Поэтому я использую тип Integer SQLite и конвертируюсь так:
BigDecimal bd = новый BigDecimal ( "1234.5678" );
int packetInt = bd.scaleByPowerOfTen(4).intValue();//packInt now = 12345678
Теперь сохраните поле packageInt в SQLite Integer.
Чтобы вернуться в BigDecimal:
BigDecimal bd = новый BigDecimal (упакованныйInt);//bd = 12345678
bd = bd.scaleByPowerOfTen(-4);//теперь bd = 1234.5678