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

21 respostas
Lincoln_Minto

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.

21 Respostas

c354r

Já tentou pegar o primeiro caractere da String?

Lincoln_Minto

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

Alexandre_Saudate

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

Vmaia

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.

ViniGodoy

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

Lincoln_Minto

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

exemplo:

String test1 = "1 + 2";

int n1=1;
int n2=2;

char = '+';
Lincoln_Minto

valeu, vou dar uma olhada.

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…

Lincoln_Minto

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…

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.

O
Você pode usar a própria API de Scripting do Java:
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();
      }
   }
ViniGodoy

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

Lincoln_Minto

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

Obrigado!

Marky.Vasconcelos

Com a classe que criei é apenas:

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

Mas aí eu preciso implementar sua classe junto…

D

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
Marky.Vasconcelos

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.

Lincoln_Minto

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.

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

:thumbup:

Vmaia

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

Marky.Vasconcelos

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

Ty. :stuck_out_tongue:

O

Mark tá de parabéns mesmo pela solução. :thumbup:

Eu postei a alternativa por 2 motivos: pro pessoal saber que existe e para o caso de um problema mais abragente ou complexo (que não envolva apenas expressões matemátcias, por exemplo). Lincoln, como provavelmente não este não é o seu caso, recomendo você serguir pelo caminho mais simples.

Vmaia

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

Ty. :P

:stuck_out_tongue: Excelente Mark !!!

Criado 28 de junho de 2010
Ultima resposta 29 de jun. de 2010
Respostas 21
Participantes 8