2009-12-24 7 views
1

J'ai une URL, que je suis l'analyse après le hachage. Le contenu après le hachage est une équation mathématique (par exemple http://example.com/something#5+1) que je voudrais trouver la somme de (ou le résultat de toute autre équation comme un produit, division, etc)chaîne => nombre conversion en JS

Je peux récupérer les nombres en utilisant:

var url = (window.location.hash).substr(1) // returns "5+1" as a string 

Bien que je trouve si j'essaie de convertir cela en nombre, il ne fait pas le calcul. Il le réduit à 5, au lieu de montrer la somme de 8.

Est ce que ce type de conversion est possible?

merci!

+5

5 + 1 n'est pas 8 dans la plupart des cas –

Répondre

0

Pour exécuter une chaîne, voir eval et certaines raisons pour ne pas le faire sont à why-is-using-javascript-eval-function-a-bad-idea.

Cela signifie dans le code d'une importance — avec des données provenant d'une source non fiable (par exemple l'Internet) — vous devriez sélectionner les chiffres et l'opération mathématique ... et ne pas accepter d'autres types d'entrée.

0
var code = "5+1"; 
var result = window.eval(code); 

Mais comme dans toutes les langues qui ont eval, soyez prudent avec ce que vous évaluez.

+4

Si vous utilisez eval, faites-le précéder d'un test, comme une expression régulière, pour vous assurer que la chaîne à évaluer correspond à ce que vous attendez. – jdigital

1

eval() est la meilleure façon d'effectuer le calcul, mais vous aurez certainement envie de vérifier que votre entrée est sain d'esprit:

var input = window.location.hash.substr(1); 
var result = null; 

try { 
    // Make sure the input is only numbers and supported operators. 
    if (/^[-+*/.()0-9]+$/.test(input)) 
    result = eval(input); 
} catch (ex) { 
    // Insert error handling here... 
} 

Cette regex doit filtrer toute entrée dangereuse.

+0

Ne pas oublier le '.' en décimales, ou'% 'en modulos. –

+1

N'oublie pas non plus Math.sin(), Math.round() etc. – slebetman

+1

@slebetman: wha? Quand la séquence de caractères "Math.sin()" fait-elle partie d'une équation mathématique valide? –

6

Ne pas eval() code arbitraire de l'URL car il peut facilement être exploité pour XSS. J'ai créé une bibliothèque appelée JSandbox qui permet d'exécuter du code JavaScript en sandbox, mais qui nécessite un support pour les travailleurs Web. Ce ne serait pas une bonne idée d'utiliser un faux support de travailleur pour IE car la sécurité du bac à sable a disparu.

Votre code irait comme suit:

JSandbox.eval("with(Math){" + location.hash.substr(1) + "}", function (res) { 
    // handle the results here 
}); 

Utilisez cette option pour gérer aussi les erreurs:

JSandbox.eval("with(Math){" + location.hash.substr(1) + "}", function (res) { 
    // handle the results here 
}, null, function (err) { 
    // handle errors here 
}); 

J'inclus une enveloppe with (Math) { ... } de sorte que le code de hachage a court accès aux fonctions mathématiques. (. Par exemple abs(..) au lieu de Math.abs(..))

0
function CalculateString(hash) { 
    var ReturnValue; 

    var patt = '([\d*+-/.%])'; 
    ReturnValue = hash.match(patt)[1]; 
    ReturnValue = eval(ReturnValue); 

    if (ReturnValue > 0) { 
     return parseInt(ReturnValue,10); 
    } else { 
     return 0; 
    } 
} 

Vous pouvez faire comme ceci:

var Hash = (window.location.hash).substr(1); 
var Calculation = CalculateString(Hash); // Retinerer result of the calculation if it is valid, otherwise it will give you 0. 
+1

Lorsque vous appelez 'parseInt', vous devez inclure la base -' parseInt (val, 10) ', ou les choses peuvent devenir octales ... – Kobi

+0

Je sais que Firebug donne des erreurs, mais je n'ai pas encore trouvé de documentation du W3C , bien que cela soit demandé. Le plus proche que j'ai trouvé est cette description ici: http://www.w3schools.com/jsref/jsref_parseInt.asp. Mais je peux mettre à jour ma réponse :) – sv88erik

1

Pour vraiment faire cela correctement, vous avez besoin d'écrire un analyseur simple pour votre langage d'expression mathématique. Ce n'est pas très difficile, mais je n'ai jamais pu le faire moi-même. C'est la seule façon d'obtenir le javascript pour évaluer et interpréter correctement l'expression mathématique, sans ouvrir la boîte pandora, et laisser passer toutes sortes de choses méchantes comme un appel simple (et stupide) à eval().

Ou vous pouvez simplement avoir un peu de regarder et de trouver quelqu'un qui a déjà fait comme ici:

http://silentmatt.com/math/evaluator.php

Questions connexes