一个 If 语句,用于查找数字字段是不是留空或有太多小数位,但如果小数位只有零则忽略

Posted

技术标签:

【中文标题】一个 If 语句,用于查找数字字段是不是留空或有太多小数位,但如果小数位只有零则忽略【英文标题】:An If statement that finds if a number field is left blank or has too many decimal places but ignores if only zeroes in decimal places一个 If 语句,用于查找数字字段是否留空或有太多小数位,但如果小数位只有零则忽略 【发布时间】:2021-01-02 14:23:21 【问题描述】:

我有这一行代码:

if ($val === "" || ($val.split(".")[1] || "").length > 2)

感谢这里好心人的帮助。但是这行代码会计算小数点后 2 位以上的数字,即使数字都是零。

问题在于人们可以添加 2.00,这很好,但不能添加 2.000,它是相同的数字。所以我想再添加一个||允许人们添加多个零小数位的语句。

整个代码是这样的:

$(document).ready(function() 
  $("#submitCalculation").click(function() 
    $(".checkLength").each(function() 
      $val = $(this).val();
      if ($val === "" || ($val.split(".")[1] || "").length > 2)     
        $(this).popover(
          html: true, 
          placement: "bottom",  
          content: '<textarea class="popover-textarea"></textarea>',
          template: '<div class="popover"><div class="arrow"></div>'+
              '<div class="row"><div class="col-3 my-auto"><i class="fas fa-exclamation-triangle" id="invalid-input7">'+
              '</i></div><div class="popover-content col-9">Enter a value between 2 and 50 m with up to 2 decimal places.'+
              '</div></div>' 
        );
        $(this).popover("show");
        $(this).click( function() 
            $(this).popover("hide");
        );
      
    )
  )
) 

它检查输入的数字是否有效,如果该字段为空白,弹出框会告诉他们并且脚本会停在那里。如果该字段的小数位太多,poppver 会告诉他们,脚本会停在那里。但是,现在的问题在于人们可以添加多个零小数位,脚本不会停止,但弹出框仍然会弹出。

期待您的帮助,这件事困扰了我一段时间。

【问题讨论】:

将输入解析为浮点数,然后将其转换回字符串。这将删除尾随零。 你能告诉我这句话是怎么做的吗,我明白你的意思,但我不知道怎么做。 而且我也不想夺走小数点后 2 位的机会,只有当小数点有非零且位数超过 2 时。 【参考方案1】:

这应该可以完成工作:

console.log("my answer:","1.2345,0.0103,4.56,2.3400,123.22000,234"
.split(",").map(val=>
  let m=val.match(/\.\d\d(.*)/);
  return val+': '+!!(m&&m[1]>0) 
) );

// the following is Barmar's method which gets it wrong in 4 cases:
console.log("Barmar's answer:","1.2345,0.0103,4.56,2.3400,123.22000,234"
.split(",").map(val=>
  val+': '+!!(val == "" || val.match(/\.\d0,2[1-9]+/))) );

在你的脚本中你需要替换

$val = $(this).val(); 
if ($val === "" || ($val.split(".")[1] || "").length > 2)  ...

$val = $(this).val(); 
let m=$val.match(/\.\d\d(.*)/);
if (!!(m&&m[1]>0))  ...

【讨论】:

这似乎是在抛出正确的答案(在我看来是相反的)。但是我如何将它添加到这一行: ($val === "" || ($val.split(".")[1] || "").length > 2)【参考方案2】:

在检查之前将数字转换为浮点数,因为这将丢弃小数点后的尾随零。然后使用正则表达式检查小数点后是否有太多数字。您也可以使用isNaN 来检查它是否根本不是数字。

$(document).ready(function() 
  $("#submitCalculation").click(function() 
    $(".checkLength").each(function() 
      const $val = $(this).val();
      let valid = true;
      const valFloat = parseFloat($val);
      if (isNaN(valFloat)) 
        valid = false;
       else if (/\.\d3/.test(valFloat.toString())) 
        valid = false;
      
      if (!valid) 
        console.log("Invalid input");
       else 
        console.log("Valid input");
      
    )
  )
)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" class="checkLength">
<button id="submitCalculation">Check</button>

【讨论】:

这是少了一个括号还是什么地方?我对这些表达方式还不是很熟悉。 我确实试过这个: const rex = /^\s*(?:\d+|0)(?:\.\d0,20*)?\s*$/ ; if (rex.test($val)) 但由于某种原因,我拥有它的方式,它只是不工作。例如,弹出窗口仍然会在 10.00000 上弹出。 @Barmar,请看看我的 sn-p。我测试了你的方法,但在 4 种情况下似乎出错了。 我修复了缺少的括号 我已经更新了答案以使用我最初的转换为浮点数的建议。

以上是关于一个 If 语句,用于查找数字字段是不是留空或有太多小数位,但如果小数位只有零则忽略的主要内容,如果未能解决你的问题,请参考以下文章

csharp 用于查找最大数字的if语句示例。

IF 语句:如果条件为假,如何将单元格留空(“”不起作用)

将字段留空更好还是用空填充?

IF 函数将日期格式的单元格留空

根据留空的文本字段选择计算

SQL中怎么设置字段为10位数字。