在字符串中仅保留数字

56
我用JavaScript制作了一个小型计算器,用户输入利率和借款金额,它会计算出他们可能获得的激励。问题是我担心用户会输入符号,例如:
Loan amount: £360,000 - Interest Rate: 4.6%
我不担心小数点,因为它们是必需的且似乎不会影响计算结果,但是像£和%这样的符号会使事情变得混乱。是否有一种简单的方法从代码中去除这些符号?
<td><input type="text" name="loan_amt" style="background-color:#FFF380;"></td>
<td><input type="text" name="interest_rate" style="background-color:#FFF380;"></td>


function Calculate()
{
    var loan_amt = document.getElementById('loan_amt').value;
    //this is how i get the loan amount entered
    var interest_rate = document.getElementById('interest_rate').value; 
    //this is how i get the interest rate

    alert (interest_rate);
}

1
可能是重复的问题:正则表达式替换除数字和小数点外的所有内容 - mplungjan
在这里提问时需要进行最基本的研究。你怎么会错过所有其他相同的问题呢? - mplungjan
你的标记有误,输入框没有ID。 - Dhaval Marthak
你也可以从输入中删除最后一个字符,因为%符号总是在利率输入的末尾。 - Dhaval Marthak
7个回答

62

请注意,您应该使用正确的DOM id通过getElementById进行引用。 您可以使用.replace()方法来实现:

var loan_amt = document.getElementById('loan_amt');
loan_amt.value = loan_amt.value.replace(/[^0-9]/g, '');

但是这也会去掉浮点数的分隔符。这是对你问题的回答,但并不是解决方案。为了将用户输入解析为数字,您可以使用parseFloat() - 我认为这将更加适合。


18
如果需要包含小数点,您可以使用.replace(/[^0-9.]/g, ''); - Moob
3
不,那不是一个好主意,因为用户可以输入1234...56,而这将被视为一个好的数字。 - Alma Do
抱歉,我对此还很陌生。我喜欢使用parseFLoat的想法,但是在将其应用于我的变量loan_amt时遇到了困难... - Reindeer
如果您不关心非法字符,只想在任何情况下提取浮点值,我想您可以先将逗号替换为点,然后删除所有非数字和非点(请参见@Moob的评论),然后应用parseFloat() - 如果它成功执行,那就是您要找的数字。 - Alma Do
4
这个解决方案无法正常工作。其他问题中被接受的答案可以正常工作:https://dev59.com/hFbTa4cB1Zd3GeqP8je_ - OMA
显示剩余4条评论

41

这是最短的:

replace(/\D/g,'');

6

这是我的解决方案:

const filterNum = (str) => {
  const numericalChar = new Set([ ".",",","0","1","2","3","4","5","6","7","8","9" ]);
  str = str.split("").filter(char => numericalChar.has(char)).join("");
  return str;
}

console.log(filterNum("143.33$"));
// 143.33

1
最佳解决方案!!=) - Jose Henrique

1
有一个非常好的插件可以使用。例如:
// 在头部包含 jQuery.js 和 autoNumeric-1.8.3.js 的 JavaScript 文件。
    <script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"> </script>
    <script src="autoNumeric-1.8.0.js" type=text/javascript> </script>

  // this example uses the id selector & no options passed    
  jQuery(function($) {
      $('#someID_defaults').autoNumeric('init');    
  });

请查看下方的检查结果 http://www.decorplanit.com/plugin/


确实非常好的插件。我希望有一天HTML5能够取代这个插件,但目前它真的很有用。 - Yevgeniy Afanasyev

1

你应该测试并拒绝无效的值,但如果你必须将一个不可靠的字符串转换为数字,则可以使用以下方法:

var inStr = "a12ab.c34...h.re567";
var justOneDot = inStr.replace(/[.](?=.*?\.)/g, '');//look-ahead to replace all but last dot
var outStr = parseFloat(justOneDot.replace(/[^0-9.]/g,'')).toFixed(2); //parse as float and round to 2dp 
// = 1234.57

this JS Bin中玩耍。

0

函数是否已经移除了所有非浮点数?双点不可行。

灵感来自JulienRioux的解决方案。

function removeAllButFloatFromInput(input, floatAmount) {
  $(input).on("input change paste", ({ target }) => {
    let { value } = target
    let allowedChars = [".", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
    let newValArr = value.split("").filter(char => allowedChars.includes(char)).join("").split(".")
    let newValStr = ""

    if (newValArr.length == 1) {
      newValStr = newValArr[0]
    } else if (newValArr.length == 2 && floatAmount !== undefined) {
      newValArr[1] = newValArr[1].substr(0, floatAmount)
      newValStr = newValArr.join(".")
    } else if (newValArr.length == 2) {
      newValStr = newValArr.join(".")
    } else if (floatAmount !== undefined) {
      newValStr = newValArr[0] + "." + newValArr.splice(1).join("").substr(0, floatAmount)
    } else {
      newValStr = newValArr[0] + "." + newValArr.splice(1).join("")
    }

    target.value = newValStr
  })

  if (!!floatAmount) {
    $(input).on("blur", ({ target }) => {
      if (!!target.value) {
        target.value = parseFloat(target.value).toFixed(floatAmount)
      } else {
        target.value = parseFloat(0).toFixed(floatAmount)
      }
    })
  }
}

0

试一下这个

例如:

var a="4.52%"
var stringLength = a.length;
var lastChar = a.charAt(stringLength - 1); 

if(lastChar.match(/[^\w\s]/)) {
    a=a.substring(0,stringLength - 1);
}

alert(a);

现在你可以将类型转换为数字


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接