У меня есть некоторая проверка на стороне клиента в текстовом поле, которое допускает только числа до двух десятичных знаков без другого ввода.
Этот сценарий был основой для ввода только числовых значений, однако его необходимо адаптировать так, чтобы он мог принимать десятичную точку, за которой следует только до двух десятичных знаков.
Я пробовал такие вещи, как /[^\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>
Мне нужно сопоставить пустую строку. Если предоставлена пустая строка и форма отправлена, значение по умолчанию возвращается к нулю.
Если есть потеря точности, чрезвычайно важно, чтобы пользователь знал об этом. Эти цифры, к сожалению, вообще очень важны.
Десятичные точки не совпадают с десятичными места!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Файл. символ имеет особое значение в RegEx, поэтому его нужно экранировать.
/^(?:\d*\.\d{1,2}|\d+)$/
Это соответствует 123.45, 123.4, 123 и .2, .24, но не пустая строка, 123., 123.456
Ах, очень хорошо, но мне нужно сопоставить пустую строку. Если предоставлена пустая строка и форма отправлена, значение по умолчанию возвращается к нулю.
Кроме того, если вы введете «123.» то я получаю сообщение об ошибке, как только помещаю точку в поле ввода, поэтому, хотя это полезно, на самом деле оно подходит только для отправки формы. Этот этап является фактическим этапом ввода.
можем ли мы обрезать число после двух десятичных знаков с помощью регулярного выражения
. означает в RegEx: любой символ, вы должны поставить перед ним обратную косую черту. \.
Лучше бы:
/^\d+(\.\d{0,2})?$/
Части я включил:
+ на *, но тогда также будут сопоставлены пустые строки.$ означает конец ввода.а для заменяемой детали вы также должны добавить точку
f.value.replace(/[^\d\.]/g, "")
Редактировать:
Если это для проверки ввода в реальном времени, почему бы вам просто не перехватить ключевые события и не проверить их достоверность (создав строку в памяти) или просто удалить последний символ в поле?
Удаление последнего символа в поле для проверки допустимости было бы полезно, только если это "." характер хотя.
gs: Это очень близко, но строка
f.value = f.value.replace(/[^\d\.]/g, "");
На самом деле не работает. На самом деле я почему-то теряю фокус текстового поля. Хотя, возможно, это мой код;)
alert ("Test10.50Test" .replace (/ [^ \ d \.] / g, "")); возвращает 10,50, поэтому должно работать. Что не работает, например, когда имеется более одной точки.
Это для ввода в реальном времени, так что обычно это сработает, но когда на самом деле это делается с вводом в реальном времени, для меня это не работает. Однако у меня могло быть что-то не так.
Вы действительно хотите сделать это с помощью регулярного выражения?
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})?$/
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>/ /: начало и конец выражения^: все, что следует далее, должно быть в начале тестируемой строки\d+: должна быть хотя бы одна цифра( )?: эта часть не обязательна\.: вот и точка\d{1,2}: здесь должно быть от одной до пяти цифр$: все, что предшествует этому, должно быть в конце тестируемой строкиВы можете использовать regexr.com или regex101.com для тестирования регулярных выражений прямо в браузере!
Вы действительно хотите, чтобы пользователь мог вводить только две цифры справа от десятичной точки, или вы можете просто подтвердить, что это число и округление до двух десятичных знаков?