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

时间:2018-04-17 20:24:43

标签: javascript reactjs formik yup

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

我尝试了.min(5).max(5),但我希望确保数字正好是5个字符(即邮政编码)。

13 个答案:

答案 0 :(得分:16)

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

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

输出:

12f1    // Must be only digits
123     // Must be exactly 5 digits
123456  // Must be exactly 5 digits
01234   // valid
11106   // valid

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

答案 1 :(得分:6)

我认为没有内置任何东西,但使用test很容易实现:

yup.string()
  .test('len', 'Must be exactly 5 characters', val => val.length === 5)

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

答案 2 :(得分:3)

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

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

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

答案 3 :(得分:2)

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

对于邮政编码,您可以使用regex来强制长度和限制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')

答案 4 :(得分:2)

当您的字段没有价值时,测试API会与ReactJs发生问题。您可以改用length API

Yup.string().length(4, 'This field has to be exactly 4 characters!')

答案 5 :(得分:1)

为什么不使用Yup的string.length?似乎正是您要寻找的东西:

yup.string().length(5)

答案 6 :(得分:1)

您仍然可以使用数字验证,但是当使用测试验证长度时,您必须在测试之前将其转换为字符串。

Yup.object().shape({
  zipCode: Yup.number()
    .required('Zip code is a required field')// optional
    .typeError('Zip code can only be a number')// optional as well
    .test('len', 'Zip code needs to be excatly 5 digits', val => val.toString().length === 5)
});

答案 7 :(得分:1)

就像类型号的魅力一样。

yup.number().test('len', 'Max 6 numbers', (val) => val.toString().length <= 6)

答案 8 :(得分:0)

要添加到其他答案中,没有一个正在检查值是否存在(尽管我发现有些人在发布此值后在评论中提到了此值)...

如果该字段不存在并且该字段保留为空,则它将尝试获取undefinednull的长度,这将为您提供JavaScript错误并防止其他情况,例如{ {1}}正常工作(如果您确实进行了设置)。

这可能会更好一些:

.required()

答案 9 :(得分:0)

@efru的answer非常适合少于22个字符的数字。但是d1_new = {('a', 'b'): 300.0, ('b, 'c'): 0.21, ('a', 'c'): 0.462, ('c', 'e'): 0.68, ('b', 'a'): 0.21', ('c','d'): 6.8} 不适用于大于22个字符的数字。这样做的原因是,在javascript中将较大的数字转换为指数格式后,会转换为指数格式。

我发现最有效的解决方案是:

Yup.number()。test('len','必须正好是25个字符',val => Math.ceil(Math.log10(val + 1))=== 25)

答案 10 :(得分:0)

import { string, date} from 'yup' // Take out what is needed in import

string()
.trim()
.matches(
  /^[0-9]{4}[0-9]{2}[0-9]{2}T 0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z$/,
  'createdOn is not in correct format',
)
.max(24),

答案 11 :(得分:0)

尝试一下:

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

答案 12 :(得分:-2)

您的方法是最正确,最简单的方法。

Yup.string()
.required()
.min(5, 'Must be exactly 5 digits')
.max(5, 'Must be exactly 5 digits')