如何将混合分数转换为十进制?

时间:2012-11-02 17:35:26

标签: javascript jquery

如何将“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;
    }

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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>

答案 2 :(得分:0)

这太糟糕了。

function ConvertFraction(fraction)
{
     eval(fraction.replace('R','').trim().replace(' ', '+'))
}