RegEx для замены строки, если она содержит более 2 десятичных знаков - PullRequest
3 голосов
/ 30 мая 2019

У меня есть пользовательский ценовой ввод, в котором я хочу разрешить 0, 1 или 2 десятичных знака.

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

ВОПРОС:

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

Что-то вроде:

  • 5 все в порядке
  • 5, это нормально, потому что он ждет десятичных дробей
  • 5,5 это нормально
  • 5,55 это нормально
  • 5,555 это НЕ ОК, и я хочу удалить последнюю цифру и вернуться к 5,55
  • 5,555555555555 это тоже НЕ ОК, пользователь может вставить что-то с дополнительными десятичными цифрами, и я хочу урезать их до 2 десятичных максимумов, возвращаясь снова к 5,55

Как я могу это сделать?

Я знаю, как сопоставить конец строки: /[,\d+]$/

Но как мне заменить первые две цифры после запятой?

Ответы [ 2 ]

4 голосов
/ 30 мая 2019

Ваш шаблон [,\d+]$ будет соответствовать запятой, цифре или знаку плюс и утверждать конец строки.

Вы можете записать в группу 1+ цифр, необязательную запятую и 0-2 цифры. затем сопоставьте 0+ цифр и замените их на группу 1.

^(\d+,?\d{0,2})\d*$

Пояснение

  • ^ Начало стрига
  • ( Группа захвата 1
    • \d+ 1+ цифр
    • ,? необязательная запятая
    • \d{0,2} 0 - 2 цифры
  • ) Закрыть группу
  • \d* Совпадение 0+ цифр
  • $ Утверждение конца строки

Regex demo

Если вы хотите сохранить часть до десятичной точки, вы можете использовать группу захвата ^(\d+),?\d{0,2}$ и заменить ее первой группой захвата:

[
  "5",
  "5",
  "5,0",
  "5,00",
  "5,000"
].forEach(s => console.log(s.replace(/^(\d+,?\d{0,2})\d*$/, "$1")));
2 голосов
/ 30 мая 2019

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

let str = '1,567895'; // price value

let val = parseFloat(str.replace(',', '.')).toFixed(2).replace('.', ',');
console.log(val);
...