[Dúvida] Transformar String "1 + 1" em int 1 + 1

Bom dia pessoal…
Estou com um problema terrível que está me quebrando a cabeça.
Preciso transformar uma String que recebe uma soma em um número inteiro contendo o resultado:

String test1="1 + 1";

Se eu colocar uma variável inteira recebendo essa soma me aparece o resultado:

int test2=1 + 1; int test2 == 2;

Mas se eu quiser converter a String para um int me dá um NumberFormatException.

String test1="1 + 1"; int test2=Integer.parseInt(test1); //ao tentar converter, teoricamente (rsrsrsr) deveria aparecer o resultado como no exemplo acima

Como eu faço para tirar o cálculo da String e transformar no resultado?

Obrigado.

Já tentou pegar o primeiro caractere da String?

Se eu fizer isso não terá sentido.
Pois se a String for “35 + 10 * 2” isso não funcionará.

Procure pelo design pattern Interpreter. Ah, e parece que o Mark_ameba, daqui do fórum, implementou algo assim e disponibilizou no site dele. Dê uma procurada por lá…

[]´s

Olá, de uma olha em regex, provavelmente ira te ajudar.

Por que isso deveria funcionar? Pois bem, NÃO tem jeito (pelo menos que eu saiba, caso tenha não aprendi a mágica ainda).
Acontece que você esta tentando transformar uma String “qualquer” em um numero e "1 + 1 " != de 1 + 1 .

De uma olhada nos artigos aqui no guj que poderão te ajudar mais, e tem algumas apostilas no site da Caelum que te darão grandes dicas :D.

Dá uma olhada: http://markytechs.wordpress.com/2009/06/22/resolver-expressoes-matematicas/

Como eu poderia separar a String contendo somente os números mas de um modo que eu saiba a operação usada?

exemplo:

[code]String test1 = “1 + 2”;

int n1=1;
int n2=2;

char = ‘+’;[/code]

valeu, vou dar uma olhada.

Única forma que achei de pegar o resultado em um int( mas sem esse sinal de mais, não tem como isso), se você quer o resultado:

	// Declara a  string com esse valor
		String teste1 = "1 + 1";
		//Pega o primeiro caractere "1" e depois o quarto "1" e atribui um a cada int
		int p1 = teste1.charAt(0);
		int p2 = teste1.charAt(4);
		/* abaixo eu crio um for, porque em ASCII
		 * o caractere "1" tem o valor "49" sendo que você quer  o valor "1".
		 */
		for(int total = p1 + p2; total >=2; total--){
			// aqui quando ele obtiver o total igual ao resultao ele imprime.
			if(total == 2){
				System.out.println("Resultado: "+total);
			}
		}

Obs: Só não entendi a lógica…

[quote=c354r]Única forma que achei de pegar o resultado em um int( mas sem esse sinal de mais, não tem como isso), se você quer o resultado:

	// Declara a  string com esse valor
		String teste1 = "1 + 1";
		//Pega o primeiro caractere "1" e depois o quarto "1" e atribui um a cada int
		int p1 = teste1.charAt(0);
		int p2 = teste1.charAt(4);
		/* abaixo eu crio um for, porque em ASCII
		 * o caractere "1" tem o valor "49" sendo que você quer  o valor "1".
		 */
		for(int total = p1 + p2; total >=2; total--){
			// aqui quando ele obtiver o total igual ao resultao ele imprime.
			if(total == 2){
				System.out.println("Resultado: "+total);
			}
		}

Obs: Só não entendi a lógica…

[/quote]

O problema começaria se fosse uma expressão gigante como por exemplo:

String n = "123456789 * 123456789 / 123456789 -123456789 +123456789";

Mas o link http://markytechs.wordpress.com/2009/06/22/resolver-expressoes-matematicas/
se não resolve ajuda muito.

Você pode usar a própria API de Scripting do Java:

[code] public static void main(String[] args) {
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine engine = mgr.getEngineByName(“JavaScript”);
try {
String exp = " 1 + 1;";
double valor = (Double) engine.eval(exp);

     System.out.println(valor);
  } catch (ScriptException ex) {
     ex.printStackTrace();
  }

}[/code]

É geralmente assim que eu fazia também, mas com Groovy.

Valeu CARA!!!
Você salvou minha vida!!!
Excelente forma de resolver!!!
Se puder comentar a finalidade de cada linha eu agradeceria…

Obrigado!

Com a classe que criei é apenas:

Expression exp = new Expression("(15+5)*8+(5-6/(5+5))");
double result = exp.resolve();

Mas aí eu preciso implementar sua classe junto…

bom, n sei pq vc qer fazer isso…já q existe varias formas mais faceis…

  • uma ideia q tive agora foi asssim,
    vc pegar essa String e transformar num array de char, ai vc ia concatenando até axar o char " + ou - ou * ou /", qndo encontrase vc tinha a primeira parte concatenada, depois vc fazia novamente até o final da string…
    entendeu??
    vlw

essa idéia é legal, mas voce tem que considerar que * e / veem antes que + e -, fora que precisa resolver os parenteses primeiro.

E como assim implementar minha classe? Voce só precisa colocar o jar no classpath.

[quote=Mark_Ameba]essa idéia é legal, mas voce tem que considerar que * e / veem antes que + e -, fora que precisa resolver os parenteses primeiro.

E como assim implementar minha classe? Voce só precisa colocar o jar no classpath.[/quote]

Mas com o código do colega em poucas linhas eu implementaria tudo, sem precisar adicionar seu arquivo “.jar”.

:thumbup:

Que lindo isso!!
Não sabia dessa… muito boa Vini!

Que lindo isso!!
Não sabia dessa… muito boa Vini!
[/quote]
Ty. :stuck_out_tongue: