2011-07-13 17 views
1

我有「1/7」並希望得到十進制等值。當然我可以使用eval(「1/7」),但考慮eval是邪惡的,還有其他方法嗎?如何避免從字符串到十進制轉換的評估

+0

變種結果= 1/7; - 問題是什麼? – Bakudan

+0

@Baku他希望結果是0.1428意思是分開這些數字。 –

+0

使用* eval *確實沒有任何問題,這就是它的意思。 – RobG

回答

3

您可以編寫自己的函數,它不是非常複雜和相當有效:

function ParseFloat(sFloat) { 
    var parts = sFloat.split("/"); 
    if (parts.length == 2) { 
     var first = parseInt(parts[0], 10); 
     var second = parseInt(parts[1], 10); 
     if (!isNaN(first) && !isNaN(second)) 
      return first/second; 
    } 
    return NaN; 
} 

用法:

var s = "1/7"; 
alert(ParseFloat(s)); 

現場測試案例:http://jsfiddle.net/RK3zS/

編輯:如果你與這些實體的工作後,我會用「階級」這個例如:

function DecimalFraction(first, second) { 
    this.first = first; 
    this.second = second; 
    this.toString = function() { 
     return first/second; 
    } 
} 

然後:

var s = new DecimalFraction(3, 7); 
alert(s); 

更優雅在我看來。更新jsFiddle

+0

乾杯@robert選擇這個,看看我的編輯。 –

+0

陰影 - 無需parseInt,除非將字符串轉換爲數字。同樣,使用返回這種微不足道的結果的構造函數是處理該問題的非常低效的方式。 – RobG

+0

@Rob,但我想讓它更靈活,知道什麼時候失敗 - 現在我的示例也只是返回'NaN',但它也可以處理這樣的事情,並顯示一些消息。關於'toString()'它只定義了一次,並且看不出爲什麼效率低下,對不起。 –

6

的eval是不是罪惡。在沒有檢查輸入的情況下在任意字符串上使用它是唯一的惡意。

1

這是我們唯一的選擇,我猜。 Eval也不是那麼邪惡。否則創建自己的函數來識別值並進行計算。

0

假設你已經計算出小數,只有小數:

txt = "1/7"; 

firstNumber = txt.subString(0, txt.indexOf('/')); 
secondNumber = txt.subString(txt.indexOf('/') + 1, txt.length); 

decml = fistNumber/secondNumber; 
0

嘗試這樣的。

var txt = "1/7"; 
var result = new Function("return " + txt)() 
console.log(result); // 0.14285714285714285 
+1

非常像'eval',因爲它可以有效評估字符串。 –

相關問題