Javascript 防止计算字段中出现多个小数点
我有一个JavaScript计算器,它使用以下代码来处理计算输入字段中的小数点(如下所示): 其中,Javascript 防止计算字段中出现多个小数点,javascript,regex,Javascript,Regex,我有一个JavaScript计算器,它使用以下代码来处理计算输入字段中的小数点(如下所示): 其中,addChar函数由以下公式给出: function addChar(input, character) { if (input.value == null || input.value == "0" ) { input.value = character } else { input.value += character } }; 和输入字段: <
addChar
函数由以下公式给出:
function addChar(input, character) {
if (input.value == null || input.value == "0" ) {
input.value = character
}
else {
input.value += character
}
};
和输入字段:
<INPUT NAME="display" ID="disp" VALUE="0" SIZE="28" MAXLENGTH="25"/>
我希望以这样一种方式增强我的代码,即限制用户在同一个数字中输入多个小数(如下所示),同时仍允许在计算字符串中输入多个小数(如下所示):
避免这种情况-
但允许这样做-
我已经研究了regex
,因为我知道我的问题的解决方案可能在某种程度上涉及到它,但我不确定如何实现它(我的JavaScript技能仍在进行中!)
我还想过用任何操作数(-,+,/,*,%
)拆分字符串,并检查结果数组的每个元素是否有小数点,但我认为这可能有点混乱
有什么想法吗?我会制作一个计数器变量,然后每次遇到
时向其添加一个,同时每次找到操作数时都重置为零。这样,如果您的计数器在for
循环的末尾多于一个,您就可以提醒用户去掉该点
伪代码:
// Do this input.length - 1 times:
// store current char in var curChar.
// check if curChar is a dot. If it is, counter++
// check if curChar is an operand. If it is, counter = 0.
// After the for loop, check if counter is 1 or 0. If it is either of
// these, the user entered an acceptable input. Otherwise, they need to
// take out the extra dots.
我会创建一个计数器变量,然后每次遇到
时向其添加一个,同时每次找到操作数时都重置为零。这样,如果您的计数器在for
循环的末尾多于一个,您就可以提醒用户去掉该点
伪代码:
// Do this input.length - 1 times:
// store current char in var curChar.
// check if curChar is a dot. If it is, counter++
// check if curChar is an operand. If it is, counter = 0.
// After the for loop, check if counter is 1 or 0. If it is either of
// these, the user entered an acceptable input. Otherwise, they need to
// take out the extra dots.
是的,您可以使用以下正则表达式验证用户输入:
^\d+(\.\d+)?([+\-*\/]\d+(\.\d+)?)*$
匹配一个小数点\d+(\.\d+)
匹配运算符[+\-*\/]
$('#disp')。on('input',function(){
if(此.value.match(/^\d+(\.\d+)([+\-*\/]\d+(\.\d+)?*$/){
$(“#状态”).show();
}否则{
$(“#状态”).hide();
}
});代码>
好的
是的,您可以使用以下正则表达式来验证用户输入:
^\d+(\.\d+)?([+\-*\/]\d+(\.\d+)?)*$
\d+(\.\d+)
匹配一个小数点
[+\-*\/]
匹配运算符
$('#disp')。on('input',function(){
if(此.value.match(/^\d+(\.\d+)([+\-*\/]\d+(\.\d+)?*$/){
$(“#状态”).show();
}否则{
$(“#状态”).hide();
}
});代码>
好的
如果输入字符串与\d\.\d+\.
匹配,您可以触发一个错误函数-这是一个数字后跟一个小数位,然后是一个或多个数字后跟另一个小数位。如果在第一个小数点后有数字以外的内容(如运算符),则不会触发错误
如果输入字符串与\d\.\d+\.
匹配,则可以触发错误函数-这是一个数字后跟一个小数位,然后是一个或多个数字后跟另一个小数位。如果在第一个小数点后有数字以外的内容(如运算符),则不会触发错误
您可以使用一个正则表达式轻松完成此操作:
^(?:(?:\d+(?:\。\d*)?\。\d+(:[-+/*%].$)+$
解释
^ # Begin of string
(?: # Group
(?: # A number
\d+
(?: \. \d* )?
| \. \d+
)
(?:
[-+/*%] # Operator
| # or,
$ # EOS
)
)+ # End group, do 1 to many times
$ # End of string
您可以使用单个正则表达式轻松完成此操作:
^(?:(?:\d+(?:\。\d*)?\。\d+(:[-+/*%].$)+$
解释
^ # Begin of string
(?: # Group
(?: # A number
\d+
(?: \. \d* )?
| \. \d+
)
(?:
[-+/*%] # Operator
| # or,
$ # EOS
)
)+ # End group, do 1 to many times
$ # End of string
所以我加了一个计数器:
dotCount = 0;
对按钮点
函数和操作数执行此操作:
$('#button-dot').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(0);
if (dotCount == 0){
if ($('#disp').hasClass("result")) {
$('#disp').removeClass("result").val("");
addChar(this.form.display,'0' + '.');
}
else if (lastChar == '.'){
// DO NOTHING
}
else if (lastChar == '1' || lastChar == '2' || lastChar == '3' || lastChar == '4' || lastChar == '5' || lastChar == '6' || lastChar == '7' || lastChar == '8' || lastChar == '9' || lastChar == '0' && firstChar != '0'){
addChar(this.form.display,'.');
}
else if (firstChar == '0'){
addChar(this.form.display,'0' + '.');
}
else {
addChar(this.form.display,'0' + '.');
}
}// END OF dotCount == 0
else if (dotCount == 1){
//DO NOTHING
}
$('#disp').removeClass("result");
dotCount = 1;
});
(以+
为例):
工作起来很有魅力!谢谢Kai Christensen的反建议。所以我添加了一个反建议:
dotCount = 0;
对按钮点
函数和操作数执行此操作:
$('#button-dot').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(0);
if (dotCount == 0){
if ($('#disp').hasClass("result")) {
$('#disp').removeClass("result").val("");
addChar(this.form.display,'0' + '.');
}
else if (lastChar == '.'){
// DO NOTHING
}
else if (lastChar == '1' || lastChar == '2' || lastChar == '3' || lastChar == '4' || lastChar == '5' || lastChar == '6' || lastChar == '7' || lastChar == '8' || lastChar == '9' || lastChar == '0' && firstChar != '0'){
addChar(this.form.display,'.');
}
else if (firstChar == '0'){
addChar(this.form.display,'0' + '.');
}
else {
addChar(this.form.display,'0' + '.');
}
}// END OF dotCount == 0
else if (dotCount == 1){
//DO NOTHING
}
$('#disp').removeClass("result");
dotCount = 1;
});
(以+
为例):
工作起来很有魅力!谢谢Kai Christensen的反对意见。谢谢,但我还是不确定如何在代码中实现它。提示?当然,我只是添加了一个demohanks,但是,再一次,我不确定如何在代码中实现它。提示?当然,我刚刚添加了一个demohanks,但我对它还是新手,根本不知道如何在我的代码中实现它。@newbie2015-正则表达式与%95语言无关。语言之间存在实现差异,但regex语言不存在。你应该把问题分成两部分。1.如何使用正则表达式。2.如何解决这个问题。如果没有第一个,你就无法理解第二个。谢谢,但我对这一点还是新手,根本不知道如何在我的代码中实现它。@newbie2015-正则表达式是%95语言独立的。语言之间存在实现差异,但regex语言不存在。你应该把问题分成两部分。1.如何使用正则表达式。2.如何解决这个问题。如果没有第一个,你就无法理解第二个。可能,如果curChar>=“0”&&curChar是的,我同意。这可以作为额外的预防措施。可能,如果curChar>='0'&&curChar是的,我同意。这可以作为额外的预防措施。