Resolver expressão matemática em String

Olá pessoal.

Alguém por aqui conhece uma API Java que me permitar passar uma String que contém uma expressão matemática e me retorne a solução?

Algo do tipo: passando “(12.5+7.5)/8” me retorne 2.5

Espero que vocês possam me ajudar!
Obrigado,

Guilherme Lima

opa :smiley:

nao sei se tem algo pronto cara…

eu tenho um livro q ensina a fazer isso aki…
chama “A arte do java” - Herbert Shildt e James Holmes - editora Campus

ele ensina isso logo no 1o capitulo… chama analisador sintatico de expressao descendente recursivo

hahahahah moh piraçao

espero ter ajudado
abraço

Valeu, Renato.

Eu não conhecia este livro, mas vou procurar. Eu estava com preguiça de desenvolver esta solução e pensei que uma coisa tão prática já deveria ter uma solução open source.

O Jasper Reports implementa uma funcionalidade assim. A gente pode definir uma expressão matemática utilizando os FIELDs e PARAMETERs para imprimir no relatório (se bem que isso deve existir em qualquer ferramenta de relatório). Mas eu não tive paciência ainda pra catar isso no código fonte. Amanhã eu faço isso…

Guilherme Lima

[quote=guilaaf]Valeu, Renato.

Eu não conhecia este livro, mas vou procurar. Eu estava com preguiça de desenvolver esta solução e pensei que uma coisa tão prática já deveria ter uma solução open source.

O Jasper Reports implementa uma funcionalidade assim. A gente pode definir uma expressão matemática utilizando os FIELDs e PARAMETERs para imprimir no relatório (se bem que isso deve existir em qualquer ferramenta de relatório). Mas eu não tive paciência ainda pra catar isso no código fonte. Amanhã eu faço isso…

Guilherme Lima

[/quote]

http://lts.online.fr/dev/java/math.evaluator/matheval.javadoc/com/primalworld/math/MathEvaluator.html

Boa Lucas,
nos meus primeiros testes, a impressão sobre esta api foi muito boa.
mandou bem…

Abraços
Wanderson

  1. :stuck_out_tongue:

Valeu mesmo, Lucas!

Eu sabia que devia existir alguma API assim! Isso vai ajudar muito no projeto que estou desenvolvendo!

Obrigado!

Guilherme Lima

As linguagens de scripts (parece que a poeira baixou um pouco), como Groovy, devem fazer isso com o peh-nas-costas. Procure por “eval” ou termos relacionados.

No developerWorks da IBM tem inclusive uma serie de artigos sobre essas linguagens (alt.lang.jre).

http://www-106.ibm.com/developerworks/views/java/articles.jsp?sort_order=desc&expand=&sort_by=Date&show_abstract=true&view_by=Search&search_by=alt.lang.jre

Marcio Kuchma

[quote=MisterX]Maeu caro vc pode me dizer como vc conseguiu usar esta API, pois estou tentando asim e da erro dizendo que não reconhece o contrutor MathEvalutor:
[/quote]

Olá,

O nome da sua classe é MathEvaluator também, assim java acaba achando que você quer instanciar sua própria classe MathEvaluator.

Use:

com.primalworld.math.MathEvaluator m = new com.primalworld.math.MathEvaluator("-5-6/(-2) + sqr(15+x)");

Ou mude o nome da sua classe.

[]s,
Sami

vc tem q pegar o jar e colocar na tua aplicação, depois imnportar assim:

import com.primalworld.math.MathEvaluator;
This jar contains a class that evaluates math expressions.
See the javadoc for more informations. 
See the source too. If you modify it, please send me a copy of the modified version.
Check the latest version to download.


Usage: 
java MathEvaluator [your math expression] 

Ex: 
java -cp meval.jar com.primalworld.math.MathEvaluator -cos(0)*(1+2) 
java -cp meval.jar com.primalworld.math.MathEvaluator .05*200+3.01

Don't put any space in the expression in command line. 
If you want to use the math evaluator in a java code do:

import com.primalworld.math.MathEvaluator;
...
MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
m.addVariable("x", 15.1d);
System.out.println( m.getValue() );
 
Spaces are allowed there.

Tópico meio velho, eu sei, mas como sempre deve ter alguém precisando disso aí, escrevi um artigo sobre a API JEP, que resolve qualquer expressão matemática (e faz muito mais) de maneira muito simples. http://cristian.totalsecurity.com.br/index.php?option=com_content&task=view&id=27&Itemid=39

Muito bom :smiley:

Maeu caro vc pode me dizer como vc conseguiu usar esta API, pois estou tentando asim e da erro dizendo que não reconhece o contrutor MathEvalutor:

import javax.swing.JOptionPane;
import java.lang.Object;
//import com.primalworld.math.MathEvaluator;

/**
 *
 * @author home
 */
public class MathEvaluator extends java.lang.Object{
    public static void main (String args[])
    {
        MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
         m.addVariable("x", 15.1d);
        //stem.out.println( m.getValue() );
        JOptionPane.showMessageDialog(null, "Valor expressão:"+ m.getValue());
    }
}

Onde esta o erro??

QQ ajuda agradeco…

Meu caro me desculpa a ignorancia, e sei que deve se tratar de algo básico, mas não estou conseguindo fazer minha classe reconhecer o pacote, estou fazendo assim:

criei uma pasta:
Projetos/com/primalworld/math = a classe do pacote MathEvaluator

depois criei a pasta:
Projetos/tentando/math/com = coloquei a minha classe, código a baixo…

package tentando.math.com;
import java.lang.Object;
public class Expressao extends java.lang.Object {
	public static void main(String[] args) {
        com.primalworld.math.MathEvaluator m = new com.primalworld.math.MathEvaluator("-5-6/(-2) + sqr(15+x)");
        m.addVariable("x", 15.1d);
        System.out.println( m.getValue() );
	}
}

Mas qdo compilo dá o erro:
Expressao.java:23: package com.primalworld.math does not exist
com.primalworld.math.MathEvaluator m = new com.primalworld.math.MathEvaluator("-5-6/(-2) + sqr(15+x)");

Desde já te agradeço.

Meu caro agora sei que o problema está com configuração de ambiente, me dá uma ajuda pfavor, já li uns 2 tutoriais e não peguei o erro:
Minha arvore está assim:
/projetos (diretorio raiz dos projetos, este fica dentro do meu home)
/projetos/com/primalworld/math/ (fica o meval.jar)
/projetos/meu/br/ (fica a classe que utiliza o classe math…

(informo onde está o .jar):
Na
CLASSPATH = %CLASSPATH%:home/misterx/projetos/com/primalworld/math/meval.jar

Também informo o diretorio raiz dos meus projetos:
CLASSPATH = %CLASSPATH%:home/misterx/projetos/

NA MINHA CLASSE *** (arquivo Calc.java)

package meu.br;
import java.lang.Object;
import com.primalworld.math.MathEvaluator;
public class Calc extends java.lang.Object {
	public static void main(String[] args) {	
        MathEvaluator m = new MathEvaluator("-5-6/(-2) + sqr(15+x)");
        m.addVariable("x", 15.1d);
        System.out.println( m.getValue() );
	}
}

Ainda assim ele dá um erro de que o classe nao existe ou esta com nome errado ( a minha classe):
Exception in thread “main” java.lang.NoClassDefFoundError: Calc (wrong name: meu/br/Calc)
at java.lang.ClassLoader.defineClass0(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:539)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:123)

MEU CARO DE QUALQUER FORMA MUITO OBRIGADO, É QUE PRECISO MUITO DEESE CODIGO E ESTOU ENROLADO DESSE JEITO.
Mister