首页 > 解决方案 > Ecto Changeset - 如何验证字段仅包含数字并接受一个小数点

问题描述

我是 Elixir 初学者。

我正在尝试验证员工工作时间的字段。我有一个属性为 的输入type="number",但是此属性不适用于 Internet Explorer 11,因此我需要后端验证以具有浏览器兼容性。

要求是:

  1. 该字段应该只包含数字,非数字字符不应该是有效的。
  2. 该字段最多允许有一位小数,步长为 0.5

例如:

这是我到目前为止得到的所有信息:

defp validate_working_hours(changeset) do

changeset
|> Changeset.validate_number(:working_hours, greater_than: 0)

end

我将如何验证我的要求?我validate_format想在这里会派上用场 - 类似于

|> Changeset.validate_format(:working_hours, <something here>)

但是在摆弄之后,我似乎无法验证这些要求。任何帮助表示赞赏,欢呼。

标签: validationelixirecto

解决方案


你在追求Ecto.Changeset.validate_format/4

...
|> validate_format(:working_hours, ~r/^\d+(?:\.[05])?$/)

此正则表达式表示至少一位数字,后跟一个可选的点,可以是 0 或 5


旁注:请注意,如果您想使此应用程序在全球范围内使用,许多国家/地区使用例如逗号 ( ,) 作为小数分隔符,并且涉及语言环境的代码必须更加繁琐。


推荐阅读