2

如何将“1 1/4”转换为 1.25?

我想接受用户输入并将其转换为等效的逻辑数字。我说是合乎逻辑的,因为 2 R 和 R 2 需要为 2(与测量脊椎按摩调整有关)。一切正常,直到他们需要能够使用混合分数。

有这方面的图书馆吗?

唯一不起作用的数字是“1 1/4”,它错误地转换为“2.75”。

    // Sample input
    var values = ["2.5", "1 1/4", "1/4", "2 R", "R 2"];

    function l(msg) {
        console.log(msg)
    }

    function toDecimal(x) {
        if (x.indexOf('/') != -1) {
            var parts = x.split(" ")
            var decParts = parts[1].split("/")
            return parseInt(parts[0], 10) + (parseInt(decParts[0], 10) / parseInt(decParts[1], 10))
        } else {
            return x
        }
    }

    function total_it_up(values){
        var total = 0,
            value = 0

        if(values === undefined)
            return 0

        $.each(values, function(index, value){
            value = value.replace(/[^0-9./]+/g, "")
            value = eval(value)
            l(value)
            total += parseFloat(value)
        })

        return total
    }

解决方案

    function toDecimal(x) {
        if (x.indexOf('/') != -1) {
            var parts = x.split(" ")
            var decParts;
            if (parts.length > 1) {
                decParts = parts[1].split("/");
            }
            else {
                decParts = parts[0].split("/");
                parts[0] = 0;
            }
            return parseInt(parts[0], 10) + (parseInt(decParts[0], 10) / parseInt(decParts[1], 10))
        } else {
            return x
        }
    }


    function total_it_up(values){
        var total = 0;

        if(values === undefined)
            return 0;

        $.each(values, function(index, value){
            total += parseFloat(toDecimal($.trim(value.replace(/[^0-9./ ]+/g, ""))));
        })

        return total;
    }
4

3 回答 3

2

我们没有看到对 toDecimal() 的任何调用,所以我假设$.each循环在您的原始代码中调用它。如果是这种情况,那么 1 1/4 将变为 2.75,因为正则表达式正在剥离 1 和 1/4 之间的空间,从而得到 11/4,即 2.75。允许空格,但$.trim结果是任何前导或尾随空格都被删除。你也不应该使用eval().

于 2012-11-02T17:46:20.153 回答
0

我之前不小心发布了 perl 而不是 JS。这是正确的。请进行清洁。

例子

    <html>
  <body>
    <script language=javascript>


 var txt='4 1/2';

      var re1='(\\d+)'; // Integer Number 1
      var re2='.*?';    // Non-greedy match on filler
      var re3='(\\d+)'; // Integer Number 2
      var re4='.*?';    // Non-greedy match on filler
      var re5='(\\d+)'; // Integer Number 3

      var p = new RegExp(re1+re2+re3+re4+re5,["i"]);
      var m = p.exec(txt);
      if (m != null)
      {
          var int1=m[1];
          var int2=m[2];
          var int3=m[3];
          document.write("("+int1.replace(/</,"&lt;")+")"+"("+int2.replace(/</,"&lt;")+")"+"("+int3.replace(/</,"&lt;")+")"+"\n");
      }
    </script>
  </body>
</html>
于 2012-11-02T17:39:15.447 回答
0

这很糟糕。

function ConvertFraction(fraction)
{
     eval(fraction.replace('R','').trim().replace(' ', '+'))
}
于 2012-11-02T17:45:15.790 回答