64

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

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

4

13 回答 13

62

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

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

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

于 2018-04-20T10:08:50.780 回答
54

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

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

于 2020-02-21T20:09:06.957 回答
28

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

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

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

于 2018-10-29T18:56:33.780 回答
23

您也可以使用string.length.

yup.string().length(5)

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

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.
于 2019-09-10T12:50:05.013 回答
12

@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')
于 2019-07-03T15:01:06.110 回答
6

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

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

这可能会稍微好一点:

// Check we have a value as well
Yup.number().test('len', 'Must be exactly 5 characters', val => val && val.toString().length === 5 )
于 2019-08-29T13:36:48.707 回答
4

试试这个:

Yup.number()
.required()
.min(10000, 'Must be exactly 5 characters')
.max(99999, 'Must be exactly 5 characters')
.label("Zip Code"),
于 2020-08-04T04:37:51.007 回答
3

就像类型号的魅力一样。

yup.number().test('len', 'Max 6 numbers', (val) => val.toString().length <= 6)
于 2021-04-09T02:19:17.803 回答
2

当您的字段没有值时,测试 API 会遇到 ReactJs 问题。您可以改用长度 API

Yup.string().length(4, 'This field has to be exactly 4 characters!')
于 2020-03-03T10:29:22.190 回答
2

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

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)
});
于 2021-02-16T11:20:04.420 回答
0

@efru 的答案适用于少于 22 个字符的数字。但是val.toString().length不适用于大于 22 个字符的数字。原因是较大的数字在转换为 javascript 中的字符串时会转换为指数格式。

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

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

于 2020-01-23T23:57:27.390 回答
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),
于 2020-07-30T13:14:18.643 回答
-3

你的方法是正确的,也是最简单的。

Yup.string()
.required()
.min(5, 'Must be exactly 5 digits')
.max(5, 'Must be exactly 5 digits')
于 2020-05-19T21:36:38.533 回答