定义 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 模式货币类型的主要内容,如果未能解决你的问题,请参考以下文章