Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 防止计算字段中出现多个小数点_Javascript_Regex - Fatal编程技术网

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 } }; 和输入字段: <

我有一个JavaScript计算器,它使用以下代码来处理计算输入字段中的小数点(如下所示):

其中,
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是的,我同意。这可以作为额外的预防措施。