RegEx для проверки целых чисел или чисел с плавающей запятой с двумя десятичными знаками

Я хочу получить regexp, чтобы разрешить следующие форматы цен ниже (это нить в форме)

РАЗРЕШАТЬ

  • (любая цена без знаков после запятой. может быть [0-9] 1 и более раз)
  • ,# (любая цена с одним десятичным знаком)
  • ,## (любая цена с двумя десятичными знаками)

НЕ ДОПУСКАТЬ

  • Что-нибудь еще... Например:
  • 5,555... (3 десятичных знака или больше)
  • Любая строка, содержащая более 1 запятой
  • Какая бы строка ни содержала какой-либо символ, это не ЦИФРА
  • ТАК ДАЛЕЕ

Пока я получил это:

/^[0-9]+(,[0-9][0-9]?)?$/

Кажется, это работает. Но действительно ли он делает то, что я хочу?

const priceRegex = /^[0-9]+(,[0-9][0-9]?)?$/;

const span1 = document.getElementById('span1');
const span2 = document.getElementById('span2');
const span3 = document.getElementById('span3');
const span4 = document.getElementById('span4');
const span5 = document.getElementById('span5');
const span6 = document.getElementById('span6');
const span7 = document.getElementById('span7');
const span8 = document.getElementById('span8');
const span9 = document.getElementById('span9');
const span10 = document.getElementById('span10');
const span11 = document.getElementById('span11');
const span12 = document.getElementById('span12');
const span13 = document.getElementById('span13');

span1.innerHTML = priceRegex.test('5') ? ' IS VALID' : ' IS NOT VALID';
span2.innerHTML = priceRegex.test('5,5') ? ' IS VALID' : ' IS NOT VALID';
span3.innerHTML = priceRegex.test('5,55') ? ' IS VALID' : ' IS NOT VALID';

span4.innerHTML = priceRegex.test('5,') ? ' IS VALID' : ' IS NOT VALID';
span5.innerHTML = priceRegex.test('5,555') ? ' IS VALID' : ' IS NOT VALID';
span6.innerHTML = priceRegex.test('5,5555') ? ' IS VALID' : ' IS NOT VALID';

span7.innerHTML = priceRegex.test('a') ? ' IS VALID' : ' IS NOT VALID';
span8.innerHTML = priceRegex.test('5a') ? ' IS VALID' : ' IS NOT VALID';
span9.innerHTML = priceRegex.test('a5') ? ' IS VALID' : ' IS NOT VALID';

span10.innerHTML = priceRegex.test('a,5') ? ' IS VALID' : ' IS NOT VALID';
span11.innerHTML = priceRegex.test('5,a') ? ' IS VALID' : ' IS NOT VALID';
span12.innerHTML = priceRegex.test('a5,5') ? ' IS VALID' : ' IS NOT VALID';
span13.innerHTML = priceRegex.test('5a,5') ? ' IS VALID' : ' IS NOT VALID';
div {
  color: black;
}

span {
  color: blue;
}

.notValid {
  color: red;
}
<div>5<span id = "span1"></span><div>
<div>5,5<span id = "span2"></span></div>
<div>5,55<span id = "span3"></span></div>

<br/>

<div>5,<span id = "span4" class = "notValid"></span><div>
<div>5,555<span id = "span5" class = "notValid"></span></div>
<div>5,5555<span id = "span6" class = "notValid"></span></div>

<div>a<span id = "span7" class = "notValid"></span></div>
<div>5a<span id = "span8" class = "notValid"></span></div>
<div>a5<span id = "span9" class = "notValid"></span></div>
 
<div>a,5<span id = "span10" class = "notValid"></span></div>
<div>5,a<span id = "span11" class = "notValid"></span></div>
<div>a5,5<span id = "span12" class = "notValid"></span></div>
<div>5a,5<span id = "span13" class = "notValid"></span></div>

Он работает... в том смысле, что он соответствует требованиям, которые вы выдвинули. Я не знаю, есть ли другие ситуации, которые могут сбить ваше регулярное выражение, например, может ли быть пробел перед числом? После номера? Может ли быть отрицательное значение -1,23? Можно +1,23? Можно ли 1.23 - с точкой? Что произойдет, если цена равна нет, но совпадает с форматом?

VLAZ 30.05.2019 16:42

Спасибо! Я не хочу допускать пробелов и отрицательных значений. Просто нужно соответствовать формату целого числа с 0, 1 или 2 десятичными знаками. То, что я получил до сих пор, достаточно хорошо?

cbdeveloper 30.05.2019 16:44

Да, так и должно быть. Единственная проблема незначительный, которую я вижу, это 5,0 и 5,00 - если вы считаете их действительными и не требуете их усечения, тогда все в порядке.

VLAZ 30.05.2019 16:45

Спасибо! Они хороши в обоих направлениях. Обрезанный или нет. Я конвертирую в число с parseFloat() перед сохранением в базе данных.

cbdeveloper 30.05.2019 16:47

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

VLAZ 30.05.2019 16:49

Ты прав. Спасибо тебе за это! Сделает это немедленно.

cbdeveloper 30.05.2019 16:52

Ваше регулярное выражение работает нормально, ничего не меняйте.

Toto 30.05.2019 18:22
Поведение ключевого слова "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) для оценки ваших знаний,...
0
7
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь мы, вероятно, начнем с двух простых выражений, а затем соединим их с помощью логического ИЛИ, возможно, что-то вроде:

^[0-9]+$|^[0-9]+,[0-9]{1,2}$

ДЕМО

Тестовое задание

const regex = /^[0-9]+$|^[0-9]+,[0-9]{1,2}$/gm;
const str = `5
5,5
5,55

5,
5,555
5,5555
a
5a
a5
a,5
5,a
a5,5
5a,5`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.info(`Found match, group ${groupIndex}: ${match}`);
    });
}

Цепь регулярных выражений

jex.im визуализирует регулярные выражения:

регулярное выражение

Если это выражение не нужно, его можно модифицировать/изменить в regex101.com.

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

Похожие вопросы

Почему программисты обычно используют префикс подчеркивания внутри некоторых переменных функций?
Дочерний компонент Vue.js с объектными литералами в качестве реквизита неожиданно обновляется при рендеринге его родителя
Как искать несколько ключевых слов в абзаце и выделять каждое ключевое слово разным цветом в javascript с помощью ReactJS?
Как использовать customjs для динамического обновления вариантов выпадающего меню в Bokeh
Правильно, зачем привязывать функцию с параметрами к дочернему компоненту в React Native
Как получить id элемента формы?
Функция Javascript работает только в первой строке только внутри моего модального окна
Получить JSON в таблицу HTML JavaScript
Сообщение об ошибке пользовательского валидатора response-bootstrap-table2 отображается в пользовательском интерфейсе
Как написать загрузчик плагинов для модуля, написанного на машинописном языке