Сохранение значений валюты в 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