2010-03-26 18 views
4

當我嘗試「eval」函數作爲eval(「020 * 05 + 05」)時,它將返回85而不是105.有人可以解釋爲什麼eval函數的行爲如此嗎?還建議任何解決這個問題。返回八進制值的Javascript eval函數

+2

您在哪裏得到了eval字符串?如果你能控制它,你可以通過糾正數字格式來節省很多麻煩。 – lincolnk 2010-03-26 14:19:23

回答

7

以零開頭的數字常量(如「020」)被解釋爲八進制數。對於C,C++,Java,Javascript和大多數任何其他語言來說都是如此,即使與C的關係模糊。

如果由於某種原因,您確實需要使用「eval()」,而且不過,我想你會發現周圍使用「的eval()」在所有的方式

var answer = eval(weirdString.replace(/\b0(\d+)\b/g, '$1')); 

:得到與數字常量假前導零的這些奇怪的字符串,你可以嘗試這樣的事情。 (請注意下面的註釋,注意上面顯示的黑客將有包含小數部分的數字的問題。)

+1

這適用於一個前導零,但它也消除了像「0.001」這樣的數字中的零,它變成了「0.01」。 – 2015-04-29 09:28:20

+0

@ M.Boeckx好點!然而,我真正的希望是,沒有人真的有這個問題:) – Pointy 2015-04-29 13:17:57

+0

我發現了另一個主題的答案,絕對好! http://stackoverflow.com/a/18082175/2164420 必須使用eval確實不太理想,所以這個解決方案就是我們這裏所需要的。它會自動刪除所有前導零。 – 2015-04-29 13:58:22

2

JavaScript將以0開頭的數字視爲八進制數。您可以刪除前導0或使用parseInt(yourNumber,10)將其轉換爲基數10.

2

下面是描述ParseInt函數如何在JavaScript中工作的鏈接,因此也是您得到意外結果的原因。

http://www.w3schools.com/jsref/jsref_parseInt.asp

+1

這很有用,但事情是如果他有那些帶有完整表達式的字符串,parseInt()本身幫助不大。這是其中的一種情況,我希望我們可以向後退步二三十步,並找出OP已經走入歧途的地方。 – Pointy 2010-03-26 14:07:37

0

「100 」 .replace(/ \ B0(\ d +)\ b/g的, '$ 1')= 「100。」,因此它危險溶液

我的解決方案:

function $calc(n, round, min, max) { 
/// <summary>calculate expression from string</summary> 
/// <param name="round" type="int">optional</param> 
/// <param name="min" type="int">optional. minimum allowed value. if less return 0</param> 
/// <param name="max" type="int">optional. maximum allowed value. if more return 0</param> 

if (!n) return 0; 
try { 
    n = Number(eval(n 
     .replace(/[^\d\.\-\+\*\/\(\)\e]/g, '')//remove illegal symbols 
     .replace(/^0+/, '')//replace first leading zero 
     .replace(/[^\d\.]+0+/g, function (s) {return s.substr(0, 1);}) //replace leading zero 
     )); 
} catch (e) { return 0; } 
if (n == 0 || !isFinite(n)) return 0; 
if (round != undefined) { var t = Math.pow(10, round); n = Math.round(n * t)/t; } 
if (min != undefined && n < min) return 0; 
if (max != undefined && n > max) return 0; 
return n; 
} 

功能是安全的。如果計算失敗或NaN無限,則返回0

$calc('0100.08-(0.01+00.04)')=100.03 
$calc('0/0')=0 //NaN 
$calc('1/3',2)=0.33 //round