【问题标题】:Converting strings to integers (Javascript)将字符串转换为整数 (Javascript)
【发布时间】:2018-02-20 15:05:05
【问题描述】:

我知道有很多人询问如何将字符串转换为整数/数字。但我找不到我要找的确切内容。

我正在尝试将数学问题转换为整数。这是我的代码:

var str = '1 + 5';
var answer = parseInt(str);
console.log(answer);

输出:1

首选输出:6

【问题讨论】:

  • 先解析这两个数字,再相加。或者,如果您不关心安全性,则可以对其进行评估。
  • eval( str )

标签: javascript string math integer


【解决方案1】:

最简单的答案是使用eval()

var answer = eval('1 + 5');

这会将6 分配给answer

当然,eval() 允许任意代码执行,因此如果字符串来自未知或不受信任的来源,则可以使用 exceptionally dangerous 函数。在这种情况下,您可能需要考虑使用类似 PegJS

的方式解析字符串

【讨论】:

    【解决方案2】:

    如果你知道脚本的来源,你可以使用函数eval,小心这种方法。

    var str = '1 + 5';
    var answer = eval(str);
    console.log(answer);

    【讨论】:

      【解决方案3】:
      var str = '1';
      var str2 = '2';
      var answer = parseInt(str);
      var answer2 = parseInt(str2);
      var result = answer+answer2;
      console.log(result);
      

      【讨论】:

        【解决方案4】:

        '1 + 5' 是一个完整的字符串,在这种情况下,您可以打破字符串并添加该数组的每个元素

        var str = '1 + 5';
        var strArray = str.split('+');
        var answer = 0;
        strArray.forEach(function(item) {
          answer += parseInt(item, 10)
        })
        console.log(answer);

        【讨论】:

        • 我正在尝试将数学问题转换为整数”。我认为1 + 5 只是一个简单的例子。
        • 是的,确实如此。另外,我正在尝试使脚本尽可能紧凑。
        【解决方案5】:

        Here's a prior post that meets your needs using third party libraries.

        解释一下,math.js 和 JavaScript Expression Evaluator 都可以解析您提供给它们的输入,然后计算表达式的含义。

        我进一步建议您阅读有关 Lexers 和 Tokenization 的文章,以了解如何分解表达式,然后尝试解析生成的标记。这也将有助于解决更复杂的问题,例如评估高级数学表达式或处理自然语言或代码的含义或正确性。

        Here's a basic lexer guide for JS

        And here's some resources on parsing mathematical expressions

        【讨论】:

          【解决方案6】:

          另一个带有Function 构造函数的。

          eq = '1 + 5';
          x = new Function('return ' + eq)();
          console.log(x)

          runMath = x => new Function(`return ${x}`)();
          
          console.log(runMath('1+5'))
          console.log(runMath('2*10'))

          【讨论】:

          • 谢谢,但这两个例子不是很紧凑,像 eval() 这样的东西对于我的简单脚本来说已经足够了。
          【解决方案7】:

          所以parseInt 给你1 的原因是因为parseInt 遍历字符串直到第一个非数字字符,并返回结果。它被“+”绊倒,只返回1。答案不需要,但仍然需要添加一些有趣的内容。如果您使用Number() 构造函数,您将始终得到NaN。正是出于这个原因,很多人会告诉你改用Number 构造函数,但我认为两者都可以使用。

          要在不使用eval 的情况下完成您想要的事情(您可能永远不应该使用它,请参阅here 了解相关信息),您可以拆分字符串并单独解析每个项目。最简单的方法是使用String.split()Array.map()

          function isNumber(n){
            return !isNaN(n)
          }
          var t = '1 + 5 + 7'
                   //split the string at whitespace into an array
                   //this looks like ['1', '+', '5', '+', '7']
          var x = t.split(' ') 
                   //convert each item to a number, parseInt works here as well
                   //this ouputs [1, NaN, 5, NaN, 7]
                   .map(Number) 
                   //filter out anything that couldn't be converted
                   //and you're left with [1,5,7]
                   .filter(isNumber) 
                   //add each item in the array to get a sum result
                   .reduce((a, b) => a + b) 
          console.log(x) //outputs 13
          

          这仅在字符串中的运算符相同的情况下才有效,但您可以添加一个测试以查看哪个运算符是哪个,并传递不同的函数来减少以获得所需的结果。如果您对掌握 javascript 感兴趣,我强烈建议您阅读有关 Array.map()Array.filter()Array.reduce() 的更多信息。这些函数非常有用,可能是整个语言中我最喜欢的一组函数。

          【讨论】:

            【解决方案8】:

            如果您不想使用eval,但仍想为示例保持代码简单,请使用正则表达式匹配数字和运算符,并使用switch 为您的运算符选择合适的大小写:

            function parser(str) {
              const match = str.match(/(\d+) ([\+\-\*\/]) (\d+)/).slice(1);
              const operator = match.splice(1, 1)[0];
              const numbers = match.map(Number);
              switch(operator) {
                case '+': return numbers[0] + numbers[1];
                case '-': return numbers[0] - numbers[1];
                case '*': return numbers[0] * numbers[1];
                case '/': return numbers[0] / numbers[1];
              }
            }
            
            console.log(parser('1 + 2'));
            console.log(parser('1 - 2'));
            console.log(parser('2 * 2'));
            console.log(parser('1 / 21'));

            【讨论】:

              猜你喜欢
              • 2023-03-19
              • 1970-01-01
              • 1970-01-01
              • 2016-01-03
              • 2011-05-09
              • 1970-01-01
              • 2012-02-21
              • 2010-12-31
              相关资源
              最近更新 更多