Существует полный и действительный поток 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
blockquote>Если вы отбросите первые 68 байтов вашего примера,
zlib.decompress()
вернет выше.Вам решать, что такое первые 68 байтов.
BigDecimal
полностью. Я услышал о некоторых людях, создающих их собственное Cash
или Money
классы, которые инкапсулируют денежную стоимость с валютой, но под кожей это все еще BigDecimal
, вероятно, с BigDecimal.ROUND_HALF_EVEN
округление.
Редактирование: , Поскольку Дон упоминает в его ответ , существуют открытые полученные проекты как timeandmoney, и пока я хвалю их за попытку препятствовать тому, чтобы разработчики имели для изобретения велосипед, у меня просто нет достаточной уверенности в предальфа-библиотеке для использования его в продуктивной среде. Кроме того, если Вы выроете вокруг под капотом, то Вы будете видеть , они используют BigDecimal
также .
Можно использовать класс DecimalFormat, в конечном счете отображение валюты оценивает. Это оказывает поддержку локализации и довольно расширяемо.
Определенно не BigDecimal. Существует столько специальных правил для округления и представления, что необходимо волноваться о.
Martin Fowler рекомендует реализации специализированного Деньги класс представить суммы валюты, и это также реализует правила для преобразования валюты.
Создание Денежного класса является способом пойти. Используя BigDecimal (или даже интервал) внизу. Тогда с помощью класса Валюты для определения округления соглашения.
, К сожалению, без Java перегрузки оператора делает его довольно неприятным созданием таких основных типов.
Существует лучшая библиотека, timeandmoney. IMO, это намного выше библиотек, обеспеченных JDK для представления этих 2 понятий.
BigDecimal
или другое представление фиксированной точки то, что обычно необходимо за деньги.
Плавающая точка (Double
, Float
) представления и вычисления неточны, ведя к ошибочным результатам.
Если бы Вы просто используете доллары и центы, я использовал бы длинное (смещенный 2 десятичными разрядами). При необходимости в большем количестве детали большое десятичное число может быть способом пойти.
Так или иначе, я, вероятно, расширил бы класс, чтобы иметь .toString (), который использует правильный формат, и как место для помещения других методов, которые могли бы подойти (Для длинного, умножение и делиться спутаются, если десятичное число не будет скорректировано)
кроме того, если Вы используете, определяют Ваш собственный класс и интерфейс, затем можно заменить реализацию по желанию.
Необходимо быть настолько осторожными при контакте со временем и деньгами.
, Когда Вы работаете с деньгами, я надеюсь, что все не должны знать, чтобы никогда использовать плавание или двойное.
, Но я не уверен в BigDecimal.
В большинстве случаев Вы будете в порядке, если Вы просто будете отслеживать центы в интервале или долго. Таким образом, Вы никогда не имеете дело с десятичным разрядом.
Вы только отображаете доллары при печати его. Всегда работайте с центами внутренние целые числа использования. Это может быть хитро, если потребность разделиться или должна использовать Math.abs ().
Однако Вы могли бы заботиться о способной половине цента, или даже сотый из цента. Я не знаю то, что является хорошим способом сделать это. Вы, возможно, просто должны были бы иметь дело с тысячной частью центов и использовать длинное. Или возможно Вы будете вынуждены использовать BigDecimal
, я сделал бы намного больше чтения на этом, но проигнорировал бы всех, кто начинает говорить об использовании плавания или дважды представлять деньги. Они просто напрашиваются на неприятности.
я чувствую, что мой совет не завершен, поэтому поместите больше хотя в него. Вы имеете дело с опасными типами!
Я бы инкапсулировал BigDecimal в классе Money, который также имеет валюту, как упоминалось выше. Важно то, что вы делаете очень много юнит-тестов, особенно при работе с разными валютами. Также неплохо, если вы добавите удобный конструктор, который принимает строку или фабричный метод, который делает то же самое, чтобы вы могли писать свои тесты примерно так:
assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD"));
Это может быть полезно для людей, прибывающих здесь поисковыми системами, чтобы узнать о JodaMoney: http://www.joda.org/joda-money/ .