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:
Stringtest1="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?
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.
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 valorStringteste1="1 + 1";//Pega o primeiro caractere "1" e depois o quarto "1" e atribui um a cada intintp1=teste1.charAt(0);intp2=teste1.charAt(4);/*abaixoeucrioumfor,porqueemASCII*ocaractere"1"temovalor"49"sendoquevocêquerovalor"1".*/for(inttotal=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 valorStringteste1="1 + 1";//Pega o primeiro caractere "1" e depois o quarto "1" e atribui um a cada intintp1=teste1.charAt(0);intp2=teste1.charAt(4);/*abaixoeucrioumfor,porqueemASCII*ocaractere"1"temovalor"49"sendoquevocêquerovalor"1".*/for(inttotal=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:
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.
O
ozix
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.