【问题标题】:Is there a way to use Zod to validate that a number has up to 2 decimal digits?有没有办法使用 Zod 来验证一个数字最多有 2 位小数?
【发布时间】:2023-01-31 09:10:53
【问题描述】:

我有一个具有数字属性的对象。我想确保该数字最多只有 2 位小数。

例如: 1 // good 1.1 // good 1.11 // good 1.111 //bad

有办法吗?

查看 Zod 的文档并在网上搜索。发现如果我的财产是一个字符串,我可以很容易地做到这一点。不确定数量。

【问题讨论】:

  • 然后只需将您的号码转换为字符串 ${number} 或 number.toString()
  • Tnx 回答 @captain-yossarianfromUkraine。在我的例子中,我无法转换值,因为验证是在通用层中完成的,我需要将我的要求定义为对象模式的一部分。世界大战?
  • 使用z.custom
  • tnx @vera。你认为定制/改进是正确的方法吗?害怕它是一个黑客(?)
  • 我不知道你还会怎么做 :p

标签: javascript typescript zod


【解决方案1】:
z.number().multipleOf(0.01)

会做 hack(是的,它也可以使用非整数!)。

但是,我担心 IEEE 754 表示问题(它甚至有自己的名字 - 但我忘了 - 并且不特定于 JS),当

z.number().multipleOf(0.01).parse(0.1 + 0.1 + 0.1)

会抛出,因为引擎盖下的 0.1 + 0.1 + 0.1 变成 0.300000000004

也许 refine() 会更可靠,即使不那么严格(下面的代码使 0.00000000001 通过,但你可以玩比较的右侧):

z.number()
  .refine(x => x * 100 - Math.trunc(x * 100)< 0.000000001)
  .parse(0.1 + 0.1  + 0.1) // ok

【讨论】:

    猜你喜欢
    • 2023-02-13
    • 2019-08-23
    • 2015-06-19
    • 2022-08-08
    • 2014-10-13
    • 2017-01-30
    • 1970-01-01
    • 2023-02-21
    • 2020-02-11
    相关资源
    最近更新 更多