2012-10-25 10 views
23

Se ho una stringa che è un'equazione matematica e voglio dividerla e quindi calcolarla. So che posso usare la funzione eval() per farlo, ma sono interessato se esiste un modo alternativo per farlo, in particolare dividendo prima le stringhe. Qualcosa di così ho comeCome posso convertire una stringa in un operatore matematico in javascript

var myString = "225 + 15 - 10" 
var newString = myString.split(" "); 

Questo si trasformerebbe myString in un array: [ "225", "+", "15", "-", "10"];

Il mio prossimo compito è di trasformare tutte le stringhe con numeri dispari in numeri interi, che penso potrei usare parseInt(); per. La mia domanda è, come faccio a trasformare il "+" e "-" in effettivi operatori aritmetici? Così alla fine mi rimane un'espressione matematica che posso calcolare?

È possibile?

+0

Il modo brutto sarebbe più se dichiarazioni. – keyser

+2

Fai un vero parser, altrimenti questo esercizio è praticamente inutile :) Ecco un buon articolo http://parsingintro.sourceforge.net/ – Esailija

+0

A meno che tu non abbia un motivo eccezionale, basta "evalare". –

risposta

50
var math_it_up = { 
    '+': function (x, y) { return x + y }, 
    '-': function (x, y) { return x - y } 
}​​​​​​​; 

math_it_up['+'](1, 2) == 3; 
+0

+1 - Questo è piuttosto elegante. – insertusernamehere

+0

Ciao grazie per quello. Funzionerebbe - ma cosa succede se l'intera stringa viene immessa da un utente? Quindi non ho il controllo su cosa siano i numeri all'interno della stringa. In altre parole, se si tratta di una calcolatrice e l'utente esegue un punch in "225 + 15 - 10", divido la stringa verso l'alto e prendo qualsiasi numero e operatore e li trasformo in un'espressione matematica. Nella soluzione che hai proposto - come sostituire automaticamente xey - non definirli manualmente? – user1775598

+0

Normalmente andrei nella direzione del parser (citato sopra da @Esailija) ma il contesto fornito nella domanda rende questa una soluzione buona e semplice. Modifica: per un controllo completo sull'input dell'utente, scrivi un parser. – psema4

0

considerare l'utilizzo di isNaN(Number(array[x])) e switch per tutto ciò che non soddisfa la condizione.

33

La funzione eval di JavaScript è stata menzionata in un commento di Oliver Morgan e volevo solo scoprire come utilizzare eval come soluzione al problema.

La funzione eval accetta una stringa e restituisce il valore di tale stringa considerato come un'operazione matematica. Ad esempio,

eval("3 + 4") 

tornerà 7 come 3 + 4 = 7.

Questo aiuta nel tuo caso perché avete un array di stringhe che si desidera si vuole trattare come gli operatori matematici e operandi che loro rappresentano.

myArray = ["225", "+", "15", "-", "10"]; 

senza convertire una delle stringhe nella propria matrice in numeri interi o gli operatori si potrebbe scrivere

eval(myArray[0] + myArray[1] + myArray[2]); 

che si tradurrà in

eval("225" + "+" + "15"); 

che si tradurrà in

eval("225 + 15"); 

che restituirà 240, il valore di aggiungere 225 a 15.

O ancora più generico:

eval(myArray.join(' ')); 

che si traducono in

eval("225 + 15 - 10"); 

che restituisce 230, il valore di aggiunta Da 15 a 225 e Sottrazione 10. Quindi puoi vedere che nel tuo caso potrebbe essere possibile saltare la conversione delle stringhe nel tuo array in numeri interi e operatori e, come ha detto Oliver Morgan, solo eval.

+0

Sto pensando di usare qualche espressione "matica" nella convalida del modulo e un parser è semplicemente eccessivo. L'uso di 'eval()' mi permette di analizzare semplicemente alcune stringhe come '<| oh' per la convalida (dove' oh' fa riferimento a un'altra classe di input form/id/etc). – pspahn

+1

Ma non usare eval() troppo. Esistono diversi motivi per cui: https://24ways.org/2005/dont-be-eval –

+0

Non utilizzare mai eval. Per qualsiasi cosa. È un enorme buco di sicurezza in JS. – Daut

Problemi correlati