定义 JSON 模式货币类型

Posted

技术标签:

【中文标题】定义 JSON 模式货币类型【英文标题】:Defining a JSON schema currency type 【发布时间】:2017-04-14 15:38:13 【问题描述】:

我正在尝试为属性定义 JSON 架构

money: 12.12

我主要关心的是最多应允许 2 位小数。我最初尝试定义这个字段是

money: 
  type: 'number',
  minimum: 0,
  multipleOf: 0.01

但是,由于floating point imprecision,这失败了。例如,使用 tv4 验证器,数字 147.41 通过验证,但 147.42 失败。是否有另一种方法来定义最多只允许 2 位小数的数字类型?

似乎“格式”属性的目的是实现这些类型的限制,但如果我这样定义字段:

money: 
  type: 'number',
  format: 'currency',
  minimum: 0

那么我该如何指定具有“货币”格式的字段最多只能允许 2 个小数位?

【问题讨论】:

这里提出的问题更像是“如何为货币数字强制保留两位小数?”。这个问题的标题“Defining a JSON schema currency type”在这里有更好的答案:***.com/q/30249406/27581 【参考方案1】:

我不喜欢整数值的东西,当涉及到百分比等问题时,我发现它并不能解决正确的数字舍入问题,(这就是其他语言具有 Decimal 类型的原因)并且想提供这个非常简单使用字符串和模式的解决方案:

"amount":
    "type": "string",
    "pattern": "^(0|([1-9]+[0-9]*))(\.[0-9]1,2)?$",
    "minLength": 1,
    "description": "A Monetary Amount",
    "examples": [
        "0",
        "0.00",
        "0.05",
        "19.95",
        "255.5",
        "120000"
    ]

如果你不想要minLength,你可以删除它。

【讨论】:

【参考方案2】:

您的最佳选择可能是将您的货币价值乘以 100。然后您就有整数,并且验证应该可以正常工作。一般来说,使用浮点存储货币值是一个错误农场,因此最好转向“整数”,即使从技术上讲它们仍然是 JSON 中的浮点值。

某些系统使用 ISO 货币代码,其中第三个字母小写来表示此类货币。例如,GBp 表示英国便士,或 USD 表示美国便士。见https://***.com/a/30635729/4323

【讨论】:

不幸的是,这不是我的选择。架构中字段的定义必须与用户输入的格式相对应,我不能合理地要求用户输入以美分、美分等为单位的货币金额。 @Dónal:我知道你会允许用户输入整美元。但是是什么阻止您转换为存储?从技术上讲,用户无论如何都输入了一个字符串——您已经将它转换为浮点值。 我没有简单的方法来截取这些值以将它们从美分转换为美元,反之亦然。在表单中输入的金额直接存储(在 Firebase 中)。架构定义的值将是持久化的,我完全依赖架构进行验证

以上是关于定义 JSON 模式货币类型的主要内容,如果未能解决你的问题,请参考以下文章

oracle中,用啥数据类型表示货币的数据类型

sap货币位数

建模 JSON 货币对象

java.io.NotSerializableException:为参数合格货币定义的设置器采用接口类型的参数

Magento 2 如何根据语言环境自定义货币符号和格式

sql server 货币 字段 类型 一般用啥类型?