在 jQuery 中,如何添加小数位数的值?

Posted

技术标签:

【中文标题】在 jQuery 中,如何添加小数位数的值?【英文标题】:In jQuery how do I add a value for number of decimal places? 【发布时间】:2021-01-02 09:00:06 【问题描述】:

我正在检查有效输入并成功检查了空白输入,但是如何使用 jquery 检查小数位的有效长度?

 if ($val === "")

这对于空白值很好,但是找到不超过 2 位小数的输入的正确语法是什么?

这是目前为止的代码,浏览器现在正在恢复到本机浏览器弹出窗口,以在输入时发出警告。

$(document).ready(function() 
  $("#submitCalculation").click(function() 
    $(".checkVelocity").each(function() 
      $val = $(this).val();
      if ($val === "") 
        if ($val.split(".")[1] || "").length > 2) 
        $(this).popover(
          placement: "left",
           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-input3">'+
              '</i></div><div class="popover-content col-9">Enter the velocity of the car between 10 and 300 ms<sup>-1</sup>, kmh<sup>-1</sup> or mph.'+
              '</div></div>' 
        );
        $(this).popover('show');
      
    )
  )
)

最初它适用于空白或不正确的非数字输入:

$(document).ready(function() 
  $("#submitCalculation").click(function() 
    $(".checkVelocity").each(function() 
      $val = $(this).val();
      if ($val === "")        
        $(this).popover(
          placement: "left",
           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-input3">'+
              '</i></div><div class="popover-content col-9">Enter the velocity of the car between 10 and 300 ms<sup>-1</sup>, kmh<sup>-1</sup> or mph.'+
              '</div></div>' 
        );
        $(this).popover('show');
      
    )
  )
)

但它不适用于小数位数超过 2 的情况。

【问题讨论】:

对不起,我在问题中犯了一个错误,意思是说不超过2 dp。所以我不介意 2、2.2 或 2.21,但不介意 2.201(尾随零在 jquery 中并不重要,因此它们无论如何都不算​​数,你可以写 2.00000000000000000 但它只会读为 2。 【参考方案1】:

要检查小数位,请拆分句点并获取数组中第二个元素的长度。由于问题已明确表示也应接受类似 2.000 或 2.210000000 的内容,因此您可以将 .parseFloat().toString().length 结合使用,以允许通过 2.0000000 或 2.22000000 等字符串:

if($val !== "" && $val.indexOf('.') > -1)
   //We have decimal places, use combination of 
   //parseFloat toString length
   //parseFloat will remove trailing zeroes.
   const decimalLength = (parseFloat($val).toString().split('.')[1] || "").length;
    
   //This doesn't work as it will block on trailing zeroes, ie. 2.000000 or 2.0100000
   //const decimalLength = $val.split('.')[1].length;

   if(decimalLength > 2) 
       //Do something
   

或者您可以采用 T.J. 建议的更精简的方法。克劳德:

if (($val.split(".")[1] || "").length > 2)  /* Disallow that many decimal places */ 

【讨论】:

或者只是:if (($val.split(".")[1] || "").length &gt; 2) /* Disallow that many decimal places */ @T.J.Crowder 有趣。我认为尝试在空字符串上拆分并对失败的拆分进行索引会引发异常,而不是产生未定义。我将您的建议放在了答案中,并将其归功于您。谢谢。 感谢您,试一试。 @T.J.Crowder 谢谢。我在控制台中对其进行了测试。我只是不知道它是这样评价的。我很欣赏你的小提琴和洞察力。我会把那个归档以备将来使用。 @PaulDavis 然后在上面的原始代码中将这一行 if ($val === "") 替换为:if ($val === "" || ($val.split(".")[1] || "").length &gt; 2) ,也请与 T.J.因为他可能已经指出了另一种情况,这不能解释,例如“2.000”失败。【参考方案2】:

您说过应该允许尾随零,而之前的答案不允许(他们会拒绝"2.000")。 (到目前为止,您并不清楚您是否想这样做。:-))

我想我倾向于使用正则表达式方法:

const rex = /^\s*(?:\d+|0)(?:\.\d0,20*)?\s*$/;
const valid = rex.test($val);

现场示例:

const rex = /^\s*(?:\d+|0)(?:\.\d0,20*)?\s*$/;
function test($val, expect) 
  const valid = rex.test($val);
  const validmsg = valid ? "valid" : "INVALID";
  const success = !valid === !expect;
  console.log(`$JSON.stringify($val): $validmsg $success ? "OK" : "<=== ERROR"`);

// Good ones
test("2", true);
test("2.1", true);
test("2.12", true);
test("2.120", true);
test("2.120000", true); // Trailing zeros okay
// Bad ones
test("", false);
test("2.123", false);
test("2.120001", false);

正则表达式/^\s*(?:\d+|0)(?:\.\d0,20*)?\s*$/ 表示:

^ - 字符串开头 \s* - 允许零个或多个空白字符(您可能希望将其省略并先修剪字符串) (?:\d+|0) - 一个非捕获组,定义了一个 alternation(多个选择),它将匹配 \d+(一个或多个数字)或 0(字面意思) (?:\.\d0,20*) - 一个非捕获组定义 \. - 文字 . 表示小数位 \d0,2 - 零、一位或两位数 0* - 任意数量的 0 字符 ? - 使其前面的整个非捕获组可选,以防根本没有小数部分 \s* - 允许零个或多个空白字符(您可能希望将其省略并先修剪字符串) $ - 字符串结束

【讨论】:

我认为 jquery 只允许尾随零并忽略它们并不重要。我进行了几次实验,无论我是小数点后一位还是 20,它们都是零,它并没有抛出“无效”结果。 @PaulDavis - jQuery 与此无关。当您拥有$val 时,您只是在使用 javascript 原生对象和函数,而不是 jQuery 提供的对象和函数。由于是字符串"2""2.0""2.00"等都是不同的。天真地计算 . 之后的字符的方法将无法允许尾随零。 @T.J.Crowder 嗨 T.J.虽然您的解决方案似乎是最好的答案,而不是天真地在字符串拆分上执行.length,这难道不是可行的吗? (parseFloat($val).toString().split('.')[1] || "").length; 使用 parseFloat 将删除尾随零。 @T.J.Crowder 我确实尝试过代码,如下所示:gyazo.com/064a59d9f2b771b2393f25b6129be51f(抱歉,它是 gif 格式的,哎呀)但它没有按预期工作。所以也许我的语法错误? 这是我尝试多个零并最终导致弹出框触发。 gyazo.com/6e1c7a471c6e8acfc0abfaf44e1754ab 很遗憾我做错了。否则看起来很棒!【参考方案3】:

另一种方法是使用正则表达式进行验证:

var regex = /^\d+(\.\d0,2)?$/g;

// returns true if valid the param has 0,1,2 decimal points, otherwise returns false
function validateDecimalPoint(param) 

  console.log(regex.test(param));

  return regex.test(param);



validateDecimalPoint('2.12');

【讨论】:

我想学习如何使用正则表达式 - 前几天我试过了,但是很痛苦。我想有一天我会再次回到那个话题。 我强烈建议您深入研究一下。最好的地方是文档。 developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/… 此外,使用在线正则表达式测试器与他们一起练习一下非常有用。希望这会有所帮助。 gyazo.com/03af82a5e3018cfdf59ebda640003024 实际上,它可能只是 html 做的而不是 jQuery.. 但无论哪种方式它都会忽略所有的零,即使我有一个最大的步骤 0.01。【参考方案4】:

这个代码已经解决了:

const isOpen = (val) => 
  const num = parseFloat(val);
  if (isNaN(num)) 
    return true;
   else 
    const decimals = num.toString().split('.')[1] || '';
    if (decimals.length > 2) 
      return true;
     else 
      return false;
    
  
;
$(document).ready(function() 
  $("#submitCalculation").click(function() 
    $(".checkLength").each(function() 
      const val = $(this).val();
      if (isOpen(val)) 
        $(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");
        );
      
    )
  )
)

简而言之:弹出框只会针对空字符串、过高的数字、过低的数字或包含太多小数位的数字触发。

相反,对于不超过最大值 (2) 或只有零的小数位的正确值、整数或小数位,弹出框不会触发。

【讨论】:

以上是关于在 jQuery 中,如何添加小数位数的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何显示一定数量的小数位数

js方法中已经获取到了文本框的值,当这个值的小数位数大于8时提示只能保留6位小数,怎么做?

如何在 .NET 中将双精度值转换为具有固定小数位数的小数类型值

Swift中数字中的小数位数

c中如何使输出的值小数点后最末位0舍去?

jquery UI Slider 怎么设置小数