Представление денежной стоимости в [закрытом] Java

Существует полный и действительный поток zlib, начинающийся со смещения 68 в ваших шестнадцатеричных данных и заканчивающийся. Он разворачивает к:

U_HEAD01005300802P9QAN-40501201514560DEDE0080ID0200180104840080BL020357031204GW3HEMP906012015060120151021193517S0010018Fernweh-Ticket natS00200012S0030001AS00900051-0-0S01200010S0140002S2S0150006BerlinS0160011NeumünsterS0210038B- Hbf 8:16 ICE794 / HH-Hbf 10:16 IC2224S0230013Krull AndreaS026000213S0270019 *************** 0484S0280013Andrea # Krull S031001006.01.2015S032001006.01.2015S035000511160S0360003271

Если вы отбросите первые 68 байтов вашего примера, zlib.decompress() вернет выше.

Вам решать, что такое первые 68 байтов.

92
задан Elijah 24 April 2009 в 09:32
поделиться

10 ответов

BigDecimal полностью. Я услышал о некоторых людях, создающих их собственное Cash или Money классы, которые инкапсулируют денежную стоимость с валютой, но под кожей это все еще BigDecimal, вероятно, с BigDecimal.ROUND_HALF_EVEN округление.

Редактирование: , Поскольку Дон упоминает в его ответ , существуют открытые полученные проекты как timeandmoney, и пока я хвалю их за попытку препятствовать тому, чтобы разработчики имели для изобретения велосипед, у меня просто нет достаточной уверенности в предальфа-библиотеке для использования его в продуктивной среде. Кроме того, если Вы выроете вокруг под капотом, то Вы будете видеть , они используют BigDecimal также .

77
ответ дан Community 5 November 2019 в 13:46
поделиться

Можно использовать класс DecimalFormat, в конечном счете отображение валюты оценивает. Это оказывает поддержку локализации и довольно расширяемо.

0
ответ дан 5 November 2019 в 13:46
поделиться

Определенно не BigDecimal. Существует столько специальных правил для округления и представления, что необходимо волноваться о.

Martin Fowler рекомендует реализации специализированного Деньги класс представить суммы валюты, и это также реализует правила для преобразования валюты.

1
ответ дан lindelof 5 November 2019 в 13:46
поделиться

Создание Денежного класса является способом пойти. Используя BigDecimal (или даже интервал) внизу. Тогда с помощью класса Валюты для определения округления соглашения.

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

2
ответ дан Kozyarchuk 5 November 2019 в 13:46
поделиться

Существует лучшая библиотека, timeandmoney. IMO, это намного выше библиотек, обеспеченных JDK для представления этих 2 понятий.

2
ответ дан Dónal 5 November 2019 в 13:46
поделиться

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

Плавающая точка (Double, Float) представления и вычисления неточны, ведя к ошибочным результатам.

3
ответ дан Ken Gentle 5 November 2019 в 13:46
поделиться

Если бы Вы просто используете доллары и центы, я использовал бы длинное (смещенный 2 десятичными разрядами). При необходимости в большем количестве детали большое десятичное число может быть способом пойти.

Так или иначе, я, вероятно, расширил бы класс, чтобы иметь .toString (), который использует правильный формат, и как место для помещения других методов, которые могли бы подойти (Для длинного, умножение и делиться спутаются, если десятичное число не будет скорректировано)

кроме того, если Вы используете, определяют Ваш собственный класс и интерфейс, затем можно заменить реализацию по желанию.

7
ответ дан Bill K 5 November 2019 в 13:46
поделиться

Необходимо быть настолько осторожными при контакте со временем и деньгами.

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

, Но я не уверен в BigDecimal.

В большинстве случаев Вы будете в порядке, если Вы просто будете отслеживать центы в интервале или долго. Таким образом, Вы никогда не имеете дело с десятичным разрядом.

Вы только отображаете доллары при печати его. Всегда работайте с центами внутренние целые числа использования. Это может быть хитро, если потребность разделиться или должна использовать Math.abs ().

Однако Вы могли бы заботиться о способной половине цента, или даже сотый из цента. Я не знаю то, что является хорошим способом сделать это. Вы, возможно, просто должны были бы иметь дело с тысячной частью центов и использовать длинное. Или возможно Вы будете вынуждены использовать BigDecimal

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

я чувствую, что мой совет не завершен, поэтому поместите больше хотя в него. Вы имеете дело с опасными типами!

2
ответ дан Pyrolistical 5 November 2019 в 13:46
поделиться

Я бы инкапсулировал BigDecimal в классе Money, который также имеет валюту, как упоминалось выше. Важно то, что вы делаете очень много юнит-тестов, особенно при работе с разными валютами. Также неплохо, если вы добавите удобный конструктор, который принимает строку или фабричный метод, который делает то же самое, чтобы вы могли писать свои тесты примерно так:

   assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
0
ответ дан 24 November 2019 в 06:31
поделиться

Это может быть полезно для людей, прибывающих здесь поисковыми системами, чтобы узнать о JodaMoney: http://www.joda.org/joda-money/ .

50
ответ дан 24 November 2019 в 06:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: