使用Yup验证字符串或数字长度

ree*_*rix 13 javascript reactjs yup formik

是否有一个验证特定长度的yup函数?

我试过.min(5).max(5),但我想要的东西,保证数量正好是5个字符(即邮政编码).

Sim*_*Ami 34

此检查可带来最佳验证体验:

Yup.string()
.required()
.matches(/^[0-9]+$/, "Must be only digits")
.min(5, 'Must be exactly 5 digits')
.max(5, 'Must be exactly 5 digits')
Run Code Online (Sandbox Code Playgroud)

输出:

12f1    // Must be only digits
123     // Must be exactly 5 digits
123456  // Must be exactly 5 digits
01234   // valid
11106   // valid
Run Code Online (Sandbox Code Playgroud)

演示:https : //codesandbox.io/s/yup-y6uph


Dav*_*ira 18

您也可以使用string.length.

yup.string().length(5)
Run Code Online (Sandbox Code Playgroud)

但它不适用于以零开头的数字:

const yup = require('yup')

const schema = yup.string().length(5)

console.log(schema.isValidSync(12345)) // (true) This is valid.
console.log(schema.isValidSync(00123)) // (false) This is NOT valid.
Run Code Online (Sandbox Code Playgroud)

  • 这就是我一直在寻找的。如果您需要改进错误消息,`yup.string().length(5, "Should be正是5个字符")` (2认同)

小智 13

@Tamlyn 的回答很好地涵盖了问题的长度验证方面。

在邮政编码的情况下,您可以使用正则表达式来强制长度和限制数字值Yup.string()(您不想使用Yup.number()类型,因为它不支持以零开头的邮政编码0####

// ##### format zip code
Yup.string().matches(/^[0-9]{5}$/, 'Must be exactly 5 digits')

// ##### and #####-#### format zip codes
Yup.string().matches(/^[0-9]{5}(?:-[0-9]{4})?$/, 'Must be 5 or 9 digits')
Run Code Online (Sandbox Code Playgroud)


Tam*_*lyn 10

我不认为内置任何东西,但它很容易实现test:

yup.string()
  .test('len', 'Must be exactly 5 characters', val => val.length === 5)
Run Code Online (Sandbox Code Playgroud)

https://runkit.com/tamlyn/5ad9b99a4ba1230012d7ac21

  • 但是如果数字的前导是 0 呢?000123.toString().length // : 输出 3 (不是 6) (3认同)
  • 我必须添加一个null检查器,因为val字符串可能为null,因为用户尚未输入任何内容 (2认同)

efr*_*fru 9

供以后参考,如果您要验证数字(邮政编码),则上述解决方案需要稍作调整。该函数应为:

Yup.number().test('len', 'Must be exactly 5 characters', val => val.toString().length === 5)

.length 不适用于数字,仅适用于字符串。

  • 我收到关于 val 未定义的警告。我看到梅塞对第一个答案的评论,并认为应该进行空检查。所以 ```Yup.number().test('len', '必须恰好是 5 个字符', (val) => { if(val) return val.toString().length === 8; })` `` 例如。 (3认同)

Bra*_*yza 9

就像类型号的魅力一样。

yup.number().test('len', 'Max 6 numbers', (val) => val.toString().length <= 6)
Run Code Online (Sandbox Code Playgroud)


小智 6

要添加到其他答案中,他们都没有检查值是否存在(我看到有些人在发布此内容后在评论中提到了这一点)...

如果它不存在并且该字段留空,它将尝试获取undefined或的长度,null然后会给您一个javascript错误并阻止其他条件,例如.required()工作(如果您像当然一样设置了它)。

这可能会稍微好一点:

// Check we have a value as well
Yup.number().test('len', 'Must be exactly 5 characters', val => val && val.toString().length === 5 )
Run Code Online (Sandbox Code Playgroud)


ano*_*ewb 5

尝试这个:

Yup.number()
.required()
.min(10000, 'Must be exactly 5 characters')
.max(99999, 'Must be exactly 5 characters')
.label("Zip Code"),
Run Code Online (Sandbox Code Playgroud)

  • 这是行不通的。以“0”开头的邮政编码怎么样?您不能将邮政编码字段设置为数字,也不能验证它是否位于两个数字之间。 (7认同)