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

Есть функция, которая проверяет значение на дробное

const isFloatNumberValue = (value: string) => (value.match(/^\d+([.,](\d{1,2})?)?$/g))

Ошибка в том, что мы можем вписать 00,01, а должно быть 0,01. Как исправить?


Ответы (4 шт):

Автор решения: Denis640Kb

В общем, Если с именно одной цифрой до точки или запятой обязательной, то так:

^[0-9][.,][0-9]+$

Специально для пользователя @And скрины с https://regex101.com/ введите сюда описание изображения введите сюда описание изображения введите сюда описание изображения

Если необходимо с несколькими нулями перед точкой, то можете воспользоваться следующим выражением:

^[0-9]*[.,][0-9]+$ //В Этом случае будет много чисел до точки и даже пройдёт .123

Если необходимо только с обязательным символом до точки(чтобы .123 не проходило) и неограниченным количеством символов перед ней, то можно так:

^\d+(?:[\.,]\d+)?$

Вариант с ограниченным количеством знаков после запятой 2

^[0-9][.,](\d{1,2})$
→ Ссылка
Автор решения: PotroNik

Шаблон regexp:

--Старая версия
^(?!0{2,})\d+([.,]\d+){0,1}$

Соответствуют шаблону:12,33; 0,01; 12,00; 11; 1,1234567
Не соответствует шаблону: 00,01; 124,; 0000,12

UPD, действительно 01,11 пропускался предыдущей версией, исправил:

^(?!0{1,}\d+)\d+([.,]\d+){0,1}$

Если есть цифры после ноля и до запятой, совпадения не будет.

→ Ссылка
Автор решения: Дмытрык

По-моему, функция определяющая дробное ли число, должна выглядить как-то так, без всяких регулярок:

const a = '00000.00001';
const b = '92929';
function isDecimal (str){
  return !isNaN(Number(str)) && Number(str) % 1 === 0
}

function isDecimal_2 (str){
  return str.split('.').length === 1;
}
console.log(isDecimal(a), isDecimal(b));
console.log(isDecimal_2(a), isDecimal_2(b));

→ Ссылка
Автор решения: Qwertiy

input { outline: none }
:invalid { border: 1px solid red }
:valid { border: 1px solid green }
<input pattern="^(0|[1-9]\d*)([.,]\d{0,2})?$" required autofocus value="0.12">

→ Ссылка