我应该使用哪种XML数据类型来表示货币/金钱?

11

在阅读了一些关于Java数据类型在货币/金钱方面的使用问题后,我决定采用 int/long 方法,其中您将货币/金钱的值存储为其最低单位(例如美分)。

这个方法也适用于存储数据吗(在 XML 中)?

我首先想到的是不行,因为它只会在存储数据时“解析”为XML十进制格式,并在读取数据时再次被“解析”。

欢迎任何建议,因为我对此还很陌生。

3个回答

9
很难在如此少的需求输入情况下为您提供设计,但我永远不会在XML中放置没有货币符号的金额。
<amount currency="GBP">230.45</amount>

但如果你在美国,如果你敢建议处理多种货币,人们可能会把你当成外星人,所以你的经验可能会有所不同...

我认为一个好的测试是否正确设计了XML是:人类读者是否能够在不查阅文档的情况下正确猜测其含义?并非所有人都共享这种要求,有时也是不切实际的。但省略小数点只会导致数据在某个环节被错误处理。


我同意可读性的观点。今天我在这里得到的两个答案非常契合,谢谢大家。 - Zac Blazic

7

i used this

<xsd:simpleType name="money">
      <xsd:restriction base="xsd:decimal">
         <xsd:fractionDigits value="2"/>
      </xsd:restriction>
</xsd:simpleType>

一个完整的示例在这里:http://www.java2s.com/Code/XML/XML-Schema/fractionDigitsformoneytype.htm - Cris
1
我猜你指的是 fractionDigits 作为 decimal 的限制,而不是 scale - Vihung
1
根据货币类型,您可能需要0到3位小数。因此,该限制无效。 - eskatos

2

我曾经使用过这个

<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。


当定义枚举类型时,注释是非常方便的工具。 - Suncat2000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接