Какой тип данных XML я должен использовать для валюты / денег?

Прочитав несколько вопросов о том, какой тип данных Java использовать для валюты / денег, я решил использовать метод int / long, в котором вы сохраняете стоимость валюты / денег как ее наименьшую единицу (например, центы).

Применимо ли это также к хранению данных (в XML)?

Первое, что приходит мне в голову, - нет, потому что он будет просто «проанализирован» в десятичный формат XML при сохранении данных и снова «проанализирован», когда я их прочту.

Любые предложения приветствуются, так как я новичок в этом.


person Zac Blazic    schedule 23.06.2011    source источник


Ответы (3)


я использовал это

<xsd:simpleType name="money">
      <xsd:restriction base="xsd:decimal">
         <xsd:fractionDigits value="2"/>
      </xsd:restriction>
</xsd:simpleType>
person Cris    schedule 23.06.2011
comment
полный образец здесь: java2s.com/Code/XML/XML-Schema /fractionDigitsformoneytype.htm - person Cris; 23.06.2011
comment
Я предполагаю, что вы имеете в виду fractionDigits как ограничение для decimal, а не scale - person Vihung; 01.03.2012
comment
В зависимости от валюты вам понадобится от 0 до 3 знаков после запятой. Значит, ограничение недействительно. - person eskatos; 21.01.2014

Трудно дать вам дизайн с таким небольшим вводом требований, но я бы никогда не поместил денежные суммы в XML без валюты:

<amount currency="GBP">230.45</amount>

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

Я думаю, что хорошей проверкой того, хорошо ли вы спроектировали XML, является следующий: догадается ли человек, читающий, правильно, что это означает, не дотянувшись до документации? Не все разделяют такое мнение о требованиях, а иногда это непрактично. Но если опустить десятичную точку, это означает, что данные будут неправильно обработаны где-то в строке.

person Michael Kay    schedule 23.06.2011
comment
Я согласен с точкой зрения читабельности. Оба ответа, которые я получил сегодня, очень хорошо сочетаются друг с другом, спасибо, ребята. - person Zac Blazic; 23.06.2011

Я использовал это

<complexType name="PaymentAmountType">
  <annotation><documentation>Type representing a payment amount (e.g. price or total)</documentation></annotation>
  <attribute name="currencyCode" type="payment:CurrencyCodeType" use="required"/>
  <attribute name="amount" type="payment:AmountType" use="required"/>
</complexType>

<simpleType name="AmountType">
  <restriction base="decimal">
    <fractionDigits value="2"/>
  </restriction>
</simpleType>

<simpleType name="CurrencyCodeType">
  <restriction base="string">
    <minLength value="3"/>
    <maxLength value="3"/>
    <pattern value="[A-Z]{3}"/>
  </restriction>
</simpleType>

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

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

person Vihung    schedule 15.05.2013
comment
Аннотации удобны при определении перечислимых типов. - person Suncat2000; 05.03.2020