防止计算字段中出现多个小数点

时间:2016-01-27 01:38:59

标签: javascript regex

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

$('#button-dot').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(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' + '.');
  }
  $('#disp').removeClass("result");
});

其中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"/>

我希望以这样的方式增强我的代码,即限制用户输入相同数字的多个小数(如下所示),同时仍允许计算字符串中的多个小数(也在下面):

避免这种情况 -

enter image description here

但请允许 -

enter image description here

我已经调查了regex因为我理解我的问题的解决方案可能会以某种方式涉及它,但我不确定如何实现它(我的JavaScript技能仍在进行中!)。

我还想过将字符串与任何操作数(-,+,/,*,%)分开并检查结果数组的每个元素是否为小数点,但我认为这可能有点混乱。

有什么想法吗?

5 个答案:

答案 0 :(得分:2)

我会创建一个计数器变量,然后在每次遇到.时为其添加一个,同时每次找到操作数时重置为零。这样,如果您的计数器在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.

答案 1 :(得分:2)

您可以使用单个正则表达式轻松完成此操作:

^(?:(?:\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

答案 2 :(得分:0)

是的,您可以使用以下正则表达式来验证用户输入:

private EntityManagerFactory entityManagerFactory;
private JpaTransactionManager jpaTransactionManager;
public JpaConfig( Properties props )
{
    ...
    if ( Boolean.parseBoolean( props.getProperty( "isTransactional" ) )
    {
        jpaTransactionManager = 
            new JpaTransactionManager( entityManagerFactory );
    }
}
  • ^\d+(\.\d+)?([+\-*\/]\d+(\.\d+)?)*$ 匹配小数
  • \d+(\.\d+)?与运营商匹配

regex101

[+\-*\/]
$('#disp').on('input', function() {
    if (this.value.match(/^\d+(\.\d+)?([+\-*\/]\d+(\.\d+)?)*$/)) {
        $('#status').show();
    } else {
        $('#status').hide();
    }
});

答案 3 :(得分:0)

如果输入字符串与\d\.\d+\.匹配,则可以触发错误函数 - 这是一个数字后跟一个小数位,然后是一个或多个数字后跟另一个小数点。如果在第一个小数点后面有任何数字以外的数字(例如运算符),则不会触发错误。

regex101

答案 4 :(得分:0)

所以我添加了一个计数器:

dotCount = 0;

button-dot函数和操作数执行此操作:

$('#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;
});

(以+为例):

$('#button-plus').click(function() {
var lastChar = $('#disp').val().slice(-1);
var firstChar = $('#disp').val().slice(0);
if (lastChar == '*' || lastChar == '-' || lastChar == '+' || lastChar == '/' || lastChar == '.' || lastChar == '(' || lastChar == '%'){
    // DO NOTHING
    }
else if (firstChar == '0'){
    // DO NOTHING
    }
else {
  addChar(this.form.display, '+');
  }
  $('#disp').removeClass("result");
  dotCount = 0;
});

像魅力一样!谢谢,凯克里斯滕森的反制想法。