Проверка с помощью Yup для проверки длины строки или номера

Есть ли функция yup, которая проверяет определенную длину?

Я пробовал .min(5) и .max(5), но я хочу что-то, что гарантирует, что число равно 5 символам (т.е. Почтовый индекс).

Ответ 1

Я не думаю, что там что-то встроено, но это легко реализовать с помощью test:

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

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

Ответ 2

Для дальнейшего использования, если вы хотите проверить число (почтовый индекс), приведенное выше решение требует небольшой настройки. Функция должна быть:

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

.length не работает на числах, только строки.

Ответ 3

Ответ @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')

Ответ 4

Чтобы добавить к другим ответам, ни один из них не проверяет, что значение существует (я вижу, что некоторые упоминали об этом в комментариях после публикации этого)...

Если его нет и поле оставлено пустым, оно будет пытаться получить длину 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 )

Ответ 5

Почему бы не использовать string.length от Yup? Кажется, это именно то, что вы ищете:

yup.string().length(5)