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

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

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

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
46
0
61 075
13
Перейти к ответу Данный вопрос помечен как решенный

Ответы 13

Ответ принят как подходящий

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

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

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

Мне пришлось добавить нулевую проверку, так как вполне возможно, что строка val имеет значение null, потому что пользователь еще ничего не набрал

Mese 18.02.2019 16:38

Работает как часы. Большое спасибо. Мы также можем сделать это необязательным.

Nagama Inamdar 02.07.2019 12:37

@Tamlyn Почему мы используем здесь string (). Test () // метод тестирования. Это тот метод, который следует использовать, или есть другой метод, который ему больше подходит? Почему-то .test () больше похож на метод тестирования ...

Roxy'Pro 23.12.2019 13:48

Но что с числами, у которых ведущее значение равно 0? 000123.toString (). Length //: выводит 3 (не 6)

karolkarp 10.01.2020 13:55

@karolkarp Я не понимаю, о чем вы. Для начала 000123.toString().length выводит 2, а не 3. Это связано с тем, что синтаксический анализатор JavaScript интерпретирует числовые литералы, начинающиеся с нуля, как восьмеричные числа. Но в JavaScript нет внутреннего представления для числа с ведущими нулями. Если в начале есть нули, то это должна быть строка. И если вам не нужны ведущие нули в строке, нормализуйте ее parseFloat("000123").toString().length === 3.

Tamlyn 06.10.2020 18:14

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

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

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

У меня было предупреждение о том, что val не определено. Я видел комментарий Мезе к первому ответу и решил, что должна быть нулевая проверка. Так, например, Yup.number().test('len', 'Must be exactly 5 characters', (val) => { if (val) return val.toString().length === 8; }).

Hylle 21.04.2020 09:45

Спасибо @Hylle. Это настоящий ответ!

Ahmed Aziz 21.11.2020 17:39

Кроме того, по возможности не храните почтовые индексы в виде целых чисел. Почтовые индексы могут начинаться с 0 (на северо-востоке), что обрезает начальный ноль. Вероятно, лучше всего хранить как varchar.

efru 12.05.2021 19:14

@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')

Привет, дтеста! Спасибо за ваше решение. Ваш код: Yup.string (). Соответствует (/ ^ [0-9] {5} $ /, 'Должно быть ровно 5 цифр') работает, но мне также нужно проверить минимум и максимум, так что я сделал был для пользователя .min (10, «Должно быть ровно 10–12 цифр.») и .max (12, «Должно быть ровно 10–12 цифр.»).

Jeanne vie 09.03.2020 10:09

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

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

Использование number() не работает, поскольку вы можете ввести защитный код, который начинается с нулей, а Yup.number () их проглатывает. Пример: 000445 будет передан в val как 445.

SimoAmi 21.02.2020 20:40

Вы также можете использовать string.length.

yup.string().length(5)

Но не работает с числами, начинающимися с нуля:

const yup = require('yup')

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

console.info(schema.isValidSync(12345)) // (true) This is valid.
console.info(schema.isValidSync(00123)) // (false) This is NOT valid.

@ mirind4 Это то, о чем он просит, необходимая длина.

David Ferreira 01.03.2020 04:19

Ах, да, я действительно неправильно понял контекст, извините. Удаляю свой комментарий, и мне нравится ваш ответ!

mirind4 01.03.2020 10:09

Это то, что я искал. Если вам нужно улучшить сообщение об ошибке, yup.string().length(5, "Should be exactly 5 chars")

benftwc 09.04.2021 13:35

отвечать @ efru отлично подходит для чисел, длина которых меньше 22 символов. Однако val.toString().length не работает с числами, длина которых превышает 22 символа. Причина этого в том, что большие числа преобразуются в экспоненциальный формат при преобразовании в строку в javascript.

Лучше всего работает следующее решение:

Yup.number().test('len', 'Must be exactly 25 characters', val => Math.ceil(Math.log10(val + 1)) === 25)

Эта проверка приводит к лучшему опыту проверки:

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

Ваше состояние будет неудачным, если zip начнется с 0, например: 08763

Inamur Rahman 16.12.2020 10:21

@InamurRahman Мой пример уже включает строку цифр с нулевым префиксом, которая проходит проверку, как показано в демонстрации. Помните, что мы проверяем строки. Вы не можете сохранить начальный ноль в числовом значении. это невозможно ни на одном языке программирования. console.info(08763) будет выводить > 8763, но console.info('08763') выводит > 08763

SimoAmi 16.12.2020 19:50

Я тестировал его с "00000" и работает как шарм. Мне понравилось это решение, спасибо @SimoAmi

Manjar 17.02.2021 11:28

Я люблю тебя, брат, за это решение

Aneesh 04.06.2021 07:04

Тестовый API сталкивается с проблемами с ReactJs, когда ваше поле не имеет значения. Вместо этого вы можете использовать API длины

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

Ваш путь правильный и самый простой.

Yup.string()
.required()
.min(5, 'Must be exactly 5 digits')
.max(5, 'Must be exactly 5 digits')
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),

Привет! Хотя этот код может решить вопрос, включая объяснение о том, как и почему это решает проблему, действительно поможет улучшить качество вашего сообщения и, вероятно, приведет к большему количеству голосов за. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для человека, который задает его сейчас. Пожалуйста, редактировать свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются.

Brian 30.07.2020 16:00

Попробуй это:

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

Этот ответ подчеркивает тот факт, что min и max по-разному работают для string () и number ().

jhamPac 12.08.2020 23:59

Это не работает. А как насчет почтовых индексов, начинающихся с 0? Вы не можете сделать поле почтового индекса числом или проверить, что оно находится между двумя числами.

Mike 15.12.2020 21:58

Вы также можете использовать проверку для числа, но при использовании теста для проверки длины вы должны преобразовать его в строку, прежде чем проверять ее.

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)
});

Работает как амулет для типа числа.

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

Другие вопросы по теме