В настоящее время я работаю над некоторой логикой регулярных выражений, чтобы заставить ввод поля ТОЛЬКО принимать (заменять / отображать) число (без буквенных символов) и применять ограничение в 2 десятичных знака ...
I "mНе знаете, как я могу сделать это более эффективным, а также добавить в (макс) 2 десятичных знака ограничение / ограничение?
Вот мой текущий на функцию keyup ()
$("#amount").on("keyup", function(){
var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;
if(!valid){
console.log('bad character found');
//strip out commas
this.value = val.replace(/,/g , "");
//strip out all non-numeric characters (leaving decimal)
//this.value = val.replace(/[^\d.-]/g, "");
this.value = val.replace(/[^0-9.]/g, "");
//enforce only (max) 2 decimal places
}
});
Iпервоначально использовал это, но это FLAWED (если вы вернетесь назад и добавите запятую в текущее / существующее число, он удалит последнюю цифру / символ в поле .. (даже если это не оскорбительный символ)
var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;
if(!valid){
//console.log("Invalid input!");
this.value = val.substring(0, val.length - 1);
}
Для ясности ...
Значение НЕ ДОЛЖНО иметь десятичную дробь и должно содержать 2 цифры после указанной десятичной запятой ... но если она есть ... Мне нужно применитьограничение в 2 символа после десятичной запятой.
- без запятых (вообще)
- допускается только 1 десятичный знак / точка
- , в то время как десятичная дробь - не требуется-.. если присутствует, убедитесь, что после периода * 1 есть только 2 десятичных знака020 *
обновление 1:
окей ... так что у меня все "близко" (хотя одна строка REGEX была бы хороша!)
Мой последний пункт «сделать» ... это каким-то образом принудительно применить (если есть «точка» ... что после него есть только 2 десятичных знака ..... хотя точка / десятичная дробь не требуется)
$("#amount").on("keyup", function(){
var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;
console.log("ORIGINAL VAL: " + val);
if(!valid){
console.log('bad character found');
var dotCheck = val.indexOf("..");
if(dotCheck >= 0){
console.log('DOT CHECK: ' + dotCheck);
console.log("PRE VAL: " + val);
val = val.replace("..", "?");
console.log("POST VAL: " + val);
}
//strip out commas
val = val.replace(/,/g , "");
console.log("AFTER COMMA VAL: " + val);
//strip out all non-numeric characters (leaving decimal)
val = val.replace(/[^0-9.]/g, "");
console.log("AFTER CHAR VAL: " + val);
//output to field
this.value = val;
}
});
окончательное обновление:
(окончательное рабочее решение) ... все еще проверяют решение регулярных выражений, опубликованное ниже ...
- нетзапятые
- без символов вне цифр / цифр
- без двойных '..' (точек)
не более 2 цифр после десятичной точки
$("#amount").on("keyup", function(){
var valid = /^\d{0,9}(\.\d{0,2})?$/.test(this.value);
val = this.value;
if(!valid){
var dotCheck = val.indexOf("..");
if(dotCheck >= 0){
val = val.replace("..", ".");
}
//strip out commas
val = val.replace(/,/g , "");
//strip out all non-numeric characters (leaving decimal)
val = val.replace(/[^0-9.]/g, "");
//enforce 2 decimal places (max)
var totalLength = val.length;
var only2DecimalsCount = val.indexOf(".");
if(only2DecimalsCount >= 0 && totalLength > (only2DecimalsCount + 2)){
val = val.substring(0, (only2DecimalsCount + 3));
}
//output to field
this.value = val;
}
});
РЕДАКТИРОВАТЬ: Я обнаружил, что это не обрабатывает что-то вроде L
1.9.9 (облом)