У меня есть следующее:
const schema = yup.object().shape({
closedBugs: yup
.number()
.typeError("Please enter a valid number")
.integer("Please enter an integer")
.required("This field is required")
.test(
"is-positive",
"Please enter a positive number",
(value) => value >= 0 && 1 / value !== -Infinity
),
});
Что отлично работает, я получаю ожидаемые сообщения проверки для всего, что не является положительным целым числом (допуская 0).
Но мне это странно:
Если я ввожу -45.1 (с точкой), я получаю сообщения:
Please enter an integer
Please enter a positive number
Но если я ввожу -45,1 (с запятой), я получаю сообщение:
Please enter a valid number
Почему это обрабатывается по-разному и есть ли способ заставить его вести себя как вход -45.1 (тот, что с точкой)?
Я решил это, изменив значение в формах реакции-хука:
<input
{...register("closedBugs", {
setValueAs: modifyBugsValues,
})}
onChange = {(e) => handleChangeEvent(e.target.name, e.target.value)}
name = "closedBugs"
placeholder = "1"
required
/>
Где находится modifyBugsValues
:
const modifyBugsValues = (value) => {
if (value === "") {
// needed in order for yup to return required field validation in case of empty field
return undefined;
} else {
// needed in order for yup to treat 1,2 as 1.2 and return integer validation
value = value.replace(/,/g, ".");
return value;
}
};
Не уверен, что есть лучший способ сделать это :D