Как правильно проверить десятичные значения?

#javascript #html #regex

Вопрос:

Я пишу функцию очистки полей ввода, которая должна проверять, является ли это входное значение десятичным или нет.

Тестовые примеры:

  • 1234 — это правда
  • 12.34 — это правда
  • 0.123 — это правда
  • 000045 — это правда
  • 000.45 — ложь
  • .45685 — ложь
  • 5..454 — ложь
  • 55874. — это правда
  • 000000 — это правда
  • 0.0. — ложь

Я не хочу показывать ошибку проверки, я просто хочу, чтобы пользователи не вводили неправильное десятичное значение.

Это регулярное выражение /^[0-9] .?[0-9] / охватывает все случаи, кроме 5-го пункта. Я думаю, что здесь единственный метод, который можно использовать, — это String.prototype.replace() вырезать ненужные неправильные символы.

P.S. Эта проверка очень похожа на HTML input type number собственную проверку, за исключением 5-го пункта, который принимается в качестве допустимого типа номера.

ОБНОВЛЕНО!

 const rgx = /^[0-9] .?[0-9] $/

const cases = [
  ["1234", true],
  ["12.34", true],
  ["0.123", true],
  ["000045", true],
  ["000.45", false],
  [".45685", false],
  ["5..454", false],
  ["55874.", true],
  ['000000', true],
  ['0.0.', false],
]

cases.forEach(([str, result]) => {
  const actual = rgx.test(str);
  if (actual !== result) {
    console.log(`Test case "${str}" failed, gave ${actual} but expected ${result}.`);
  }
}); 

Комментарии:

1. Вы не хотите, чтобы пользователь не мог ввести «55874.» из вашего последнего варианта использования, потому что они могут захотеть добавить другую цифру, например «55784.1», которая является допустимой десятичной

2. Спасибо за записку, обновил вопрос.

3. Попробуй const rgx = /^(?:0(?:(?:0*[1-9]d*)?|(?=.))|[1-9]d*)(?:.[0-9]*)?$/

4. Случай «00000» не удался, но не должен.

5. Вы отредактировали вопрос с учетом комментария @Dexygen, но вы все равно показываете "55874." совпадение. Числа с плавающей запятой никогда не пишутся таким образом. В комментарии ниже вы указываете: «Мне нужно заменить неверные символы пустой строкой»., но в вопросе о замене символов нет упоминания.

Ответ №1:

Вы можете проверить, не начинается ли строка с 2 или более нулей

 ^(?!00 .)[0-9] .?[0-9]*$
 

Демонстрация регулярных выражений

Обратите внимание, что ваш шаблон ^[0-9] .?[0-9] $ соответствует по крайней мере 2 цифрам, так как только запятая необязательна.

 const rgx = /^(?!00 .)[0-9] .?[0-9]*$/

const cases = ["1234",
  "12.34",
  "0.123",
  "000045",
  "000.45",
  ".45685",
  "5..454",
  "55874.",
  "000000",
  "0.0."
]

cases.forEach(s => console.log(`${s} --> ${rgx.test(s)}`)); 

Комментарии:

1. Мне нужно заменить неверные символы пустой строкой.

2. @NorayrGhukasyan, тогда как этот шаблон ^[0-9] .?[0-9] $ подходит для всех примеров, кроме 000.45

3. Пожалуйста, ознакомьтесь с обновленной версией. 5645. это также верно, поскольку пользователь может намереваться дополнить это другой цифрой, например «55784.1», которая является допустимой десятичной, как указано @Dexygen в комментарии .

4. @NorayrGhukasyan Это также будет соответствовать точке в конце regex101.com/r/AtjNgX/1

5. Да, я не считал, что это вполне оправданный отдельный ответ, но я проделал всю работу, поэтому не смог удержаться и опубликовал его. «Парение», очевидно, было насмешливым.