定义JSON模式货币类型

时间:2016-11-30 10:43:23

标签: json validation jsonschema

我正在尝试为属性

定义JSON模式
money: 12.12

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

我不喜欢整数值的东西,我发现当涉及百分比之类的东西(这就是为什么其他语言具有Decimal类型的原因)时,当涉及到正确的数字舍入时,它不能解决实际问题。使用字符串和模式的解决方案:

"amount":{
    "type": "string",
    "pattern": "^(0{1}|([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