Ограничение десятичных знаков JavaScript с помощью RegEx

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

Этот сценарий был основой для ввода только числовых значений, однако его необходимо адаптировать так, чтобы он мог принимать десятичную точку, за которой следует только до двух десятичных знаков.

Я пробовал такие вещи, как /[^\d].\d{0,2}, но тогда вызов замены не работал, и я понятия не имел, как это сделать.

Код

<script type = "text/JavaScript">
  function valid(f) {
    if (!/^\d*$/.test(f.value)) {
      f.value = f.value.replace(/[^\d]/g,"");
      alert("Invalid number");
    }
  }
</script>

Примечание

Мне нужно сопоставить пустую строку. Если предоставлена ​​пустая строка и форма отправлена, значение по умолчанию возвращается к нулю.

Вы действительно хотите, чтобы пользователь мог вводить только две цифры справа от десятичной точки, или вы можете просто подтвердить, что это число и округление до двух десятичных знаков?

Prestaul 22.01.2009 17:27

Если есть потеря точности, чрезвычайно важно, чтобы пользователь знал об этом. Эти цифры, к сожалению, вообще очень важны.

Kezzer 23.01.2009 11:37

Десятичные точки не совпадают с десятичными места!

Lightness Races in Orbit 15.11.2011 20:39
Поведение ключевого слова "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) для оценки ваших знаний,...
9
3
33 158
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

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

Файл. символ имеет особое значение в RegEx, поэтому его нужно экранировать.

/^(?:\d*\.\d{1,2}|\d+)$/

Это соответствует 123.45, 123.4, 123 и .2, .24, но не пустая строка, 123., 123.456

Ах, очень хорошо, но мне нужно сопоставить пустую строку. Если предоставлена ​​пустая строка и форма отправлена, значение по умолчанию возвращается к нулю.

Kezzer 22.01.2009 14:33

Кроме того, если вы введете «123.» то я получаю сообщение об ошибке, как только помещаю точку в поле ввода, поэтому, хотя это полезно, на самом деле оно подходит только для отправки формы. Этот этап является фактическим этапом ввода.

Kezzer 22.01.2009 14:36

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

VISHAL SINGH 07.09.2017 09:46

. означает в RegEx: любой символ, вы должны поставить перед ним обратную косую черту. \.

Лучше бы:

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

Части я включил:

  • Перед точкой должно быть не менее 1 числа. Если вы этого не хотите, замените + на *, но тогда также будут сопоставлены пустые строки.
  • Если у вас есть десятичные значения, вам нужна точка впереди.
  • После числа ничего не должно быть, $ означает конец ввода.

а для заменяемой детали вы также должны добавить точку

f.value.replace(/[^\d\.]/g, "")

Редактировать:

Если это для проверки ввода в реальном времени, почему бы вам просто не перехватить ключевые события и не проверить их достоверность (создав строку в памяти) или просто удалить последний символ в поле?

Удаление последнего символа в поле для проверки допустимости было бы полезно, только если это "." характер хотя.

Kezzer 28.01.2009 14:06

gs: Это очень близко, но строка

f.value = f.value.replace(/[^\d\.]/g, "");

На самом деле не работает. На самом деле я почему-то теряю фокус текстового поля. Хотя, возможно, это мой код;)

alert ("Test10.50Test" .replace (/ [^ \ d \.] / g, "")); возвращает 10,50, поэтому должно работать. Что не работает, например, когда имеется более одной точки.

Georg Schölly 22.01.2009 15:00

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

Kezzer 23.01.2009 11:36

Вы действительно хотите сделать это с помощью регулярного выражения?

function valid(f) {
    if (isNaN(f)){return false;}
    return 100 * f == parseInt(100*f,10);
}

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

Ниже представлена ​​функция Javascript для этого.

 if (MoreThanOnePoint(document.getElementById("txtNoofHrs").value) == false) {
     alert("Please enter one decimal only");
     document.forms[0].txtNoofHrs.focus();
     return false;
 }

 function MoreThanOnePoint(strString) {
     var strChar;
     var blnResult = true;
     var varcount = 0;

     for (i = 0; i < strString.length && blnResult == true; i++) {

         if (strString.charAt(i) == ".") {
             varcount++;
             if (varcount > 1) {
                 //alert("Please enter one decimal only");
                 blnResult = false;
             }
         }
     }
     return blnResult;
 }

Вы можете использовать функцию javascript вместо регулярного выражения

function IsValid(value) {
    var split = value.split('.');

    if (split.length != 2) {
        return false;
    }
    else if (split[1].length > 2 || !Number(split[1])) {
        return false;
    }
    else if (!(split[0] == '' || split[0] == '0')) {
        return false;
    }

    return true;
}

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

/^\d+(\.\d{1,2})?$/

JavaScript

function valid(f) {
  if (!f.value) { // Test if text field is empty
    f.value = 0; // Initialize value to 0
    console.info("Valid number"); // Let user know input is OK
  } else if (!/^\d+(\.\d{1,2})?$/.test(f.value)) { // Test regex
    f.value = ""; // Empty the text box
    console.error("invalid number"); // Let user know input is not OK
  } else {
    console.info("Valid number"); // Let user know input is OK
  }
}

document.getElementById("testbutton").addEventListener( // Add event listener to button
  "click",
  valid.bind( // Bind the text field to the `value` function
    this, 
    document.getElementById("testfield")
  )
);
<input id = "testfield" value = "15.1" />
<button id = "testbutton">Test expression</button>

Объяснение

  1. / /: начало и конец выражения
  2. ^: все, что следует далее, должно быть в начале тестируемой строки
  3. \d+: должна быть хотя бы одна цифра
  4. ( )?: эта часть не обязательна
  5. \.: вот и точка
  6. \d{1,2}: здесь должно быть от одной до пяти цифр
  7. $: все, что предшествует этому, должно быть в конце тестируемой строки

Кончик

Вы можете использовать regexr.com или regex101.com для тестирования регулярных выражений прямо в браузере!

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