Pessoal
como converter de String para Int sem usar a biblioteca java. Alguma dica? A apostila da caelum pede isso!
será que tem q usar tabela unicode?
e como implementar?
Converter de String para Int sem usar a biblioteca java
36 Respostas
int num = Integer.parseInt(“1”);
o Vingdel programando essa hora tb hehehe?!!
esse metodo eu sei mas a apostila pede pra nao usar metodo.
fazer no braço
alguma dica?
Você disse que não poderia usar métodos da classe String e não usei… Usei método da class Integer.
Abraço!
até fui reler o enunciado da apostila e vi
me expressei mal Vingdel.
Na realidade pede pra não usar nehuma biblioteca do java.
mas mesmo assim obrigado pela resposta 
Tem que indexar a String pra pegar os dígitos individualmente, subtrair ‘0’ para pegar o valor numérico e multiplicar por 10 dependendo da posição. Em pseudocodigo deve ficar mais ou menos assim:
string c = “12345”;
int d;
int total;
int i = 0;
para cada caractere individual da string faça
d = c[i] - ‘0’;
total = (total * 10) + d;
i = i + 1;
fim-para;
A variável total sai desse código com o valor em inteiro da string.
Se eu não me engano o livro do Dennis Ritchie “C, a linguagem de programação” tem esse exemplo. Só não sei como indexar caracteres de uma string em java sem usar algum método de classe.
Abraços
Marcio
Olá,
Tente criar seu próprio método olhando como a função em C “atoi” faz isso:
http://www.student.cs.uwaterloo.ca/~cs350/common/os161-src-html/atoi_8c-source.html
Até.
Obrigado ai ao Marcoy e ao Paulada
Galera qdo o PC tem falhas entra em modo de segurança e o nub aqui no java qdo trava entra em modo Dinossauro e ai já viu, milhões de anos até recuperar a vel normal de processamento do brain hehhe.
Por isso ainda não tentei analizar o post de vcs.
Ainda to na minha própria tentativa.
A apostila da caelum diz que um char poder virar int ao natural.
Ora, pensei então, um digito String é aceito por uma variavel char então basta eu pegar a String e colocar num array de char e atribuir cada posição desse array de char a cada posição respectiva de um array de inteiros e pra terminar fazer uma variavel do tipo inteiro receber o valor desse array de inteiros.
O problema tá sendo que só consigo pegar uma posição do array de inteiros pra armazenar na var tipo inteiro.
Se eu pudesse pegar o valor completo do array de inteiros pra amramazenar na var inteiro tava resolvido
alguem pode me dar uma luz ai?
depois vou analizar o que foi proposto nos posts acima!
lembrando que nao pode usar a biblioteca java
eu próprio acho que infliji essa regra do exercicio pois usei charAt() e length()
ta aqui meu codigo
int[] arrayInteiros = new int[3];
char[] arrayChar = new char[3];
int inteiro = arrayInteiros[3];
String c = "999";
for (int i=0; i<3; i++){
arrayChar[i] = c.charAt(i);
arrayInteiros[i] = arrayChar[i];
}
System.out.println(inteiro);
ta aqui meu codigoint[] arrayInteiros = new int[3]; char[] arrayChar = new char[3]; int inteiro = arrayInteiros[3]; String c = "999"; for (int i=0; i<3; i++){ arrayChar[i] = c.charAt(i); arrayInteiros[i] = arrayChar[i]; } System.out.println(inteiro);
Boa tarde, rafaelczy!
Seu código não faz sentido.
Você ao menos tentou faze-lo rodar?
Faça um teste.
eu estou tentando arrumar ele, realmente tem coisa errada.
eu nao sei como pegar o valor total do array com todas posições concatenadas
eu tinha que conseguir fazer :
inteiro = todo array concatenado;
e nao como fiz:
inteiro = arrayInteiros[3];
ufss
Faz assim:
array[0] = 2; // 2*10^3 - repare que o expoente é o maior indice
array[1] = 3; // 3*10^2 - repare que o expoente é o maior indice-1
array[2] = 4; // 4*10^1 - repare que o expoente é o maior indice-2
array[3] = 5; // 5*10^0 - repare que o expoente é o maior indice-3Além disso você deve soma-los ao final.
2000 + 300 + 20 + 5 = 2345
A ideia eu já te dei e os recursos para isso você já viu, basta você desenvolver a lógica.
Abraço!
creio q entendi Vingdel
vou tentar implementar
eu pensava q eu era bom de logica mas to vendo que nao
eu nunca iria sacar essa sua logica ai, parabens mesmo!
até gostaria de te perguntar, tu raciocinou isso agora ou ja tinha visto isso antes postado por outros?
valeu!
pessoal acho q to qse
ajuda ae!!!
String s = "2345";
char[] arrayChar = new char[4];
int[] arrayInt = new int[4];
int inteiro;
int expoente = 3;
int soma = 0;
for (int i=0; i<=arrayChar.length-1; i++){
arrayChar[i] = s.charAt(i); // aqui tinha q passar 2, 3, 4, 5 respectivamente e passou 50, 51, 52, 53 (posição na tab unicode)
arrayInt[i] = arrayChar[i];
inteiro = arrayInt[i]*10^expoente; // aqui deveria ser equivalente a 10 elevado na 3 (no primeir loop)
expoente-- ; // mas creio que a minha implentação nao esta dizendo isso
soma += inteiro;
System.out.println(inteiro);
}
System.out.println("O inteiro e: " + soma);
alguem no plantao ajuda ai ?
Ainda tá meio confuso, dá pra simplificar mais. Não precisa de tantos vetores (arrays). Aliás não precisa de nenhum.
Declare apenas as seguintes variáveis
String s = "12345"; //String a ser convertida para inteiro
int d; //dígito que resulta da subtração do caractere indexado pelo '0' do unicode. Ex: '2' - '0' = 2
int i; //contador/indexador da string
int total; // acumulador do valor total, vai somando (total * 10) + d
Eu testei aqui aquele pseudo-codigo que fiz no post anterior e funcionou. Queima a muringa mais um pouco aí que você vai chegar lá.
Abraços
ai Macoy
o brain pifou aqui… nao guento mais… vo nanar
mas cara eu vi teu pseudo codigo e o cod que postei foi o jeito q arrumei pra codificar o teu pseudo codigo (claro dentro do meu limitado ponto de vista)
nao to sabendo fazer sem usar array
ufsss
mas amnha tento mais
valeu!
ah… tem alguma ideia pra mim pegar um char componente da string de cada vez sem usar o charAt() ?
creio q entendi Vingdel
vou tentar implementar
eu pensava q eu era bom de logica mas to vendo que nao
eu nunca iria sacar essa sua logica ai, parabens mesmo!
até gostaria de te perguntar, tu raciocinou isso agora ou ja tinha visto isso antes postado por outros?
valeu!
rafaelczy, pensei na hora que li a sua dificuldade.
A questão era pensar em posicionar os números em seu devidos lugares sem que um interferisse no outro.
Quanto ao seu código, para fazer potenciação existem um método chamado pow() da classe Math.
Procure sobre ele na documentação java. Cara, sempre que você quiser saber sobre alguma classe java, recorra ao google. Por exemplo, se você quer saber sobre a classe Math, busque por “Math java se6” vai ser o primeiro link para você. Já vi que você gosta de falar inglês. Creio que você não vá ter dificuldade de entender.
Quanto a variável expoente, inicialize ela com o valor do comprimento da string-1.
Cara, quero fazer você pensar, por isso não te dou a resposta. Entende, ne?
Abraço!
botei um carvao pra nao dormir de barriga vazia
legal galera so passei pra desejar boa programaçãp pra quem fica
nao aguento ler mais nada mas amnha recomeço a queimação de neuronios
valeu ai Vingdel
Ainda tá meio confuso, dá pra simplificar mais. Não precisa de tantos vetores (arrays). Aliás não precisa de nenhum.Declare apenas as seguintes variáveis
String s = "12345"; //String a ser convertida para inteiro int d; //dígito que resulta da subtração do caractere indexado pelo '0' do unicode. Ex: '2' - '0' = 2 int i; //contador/indexador da string int total; // acumulador do valor total, vai somando (total * 10) + dEu testei aqui aquele pseudo-codigo que fiz no post anterior e funcionou. Queima a muringa mais um pouco aí que você vai chegar lá.
Abraços
Macoy_AbZ, boa noite!
Este teste que você fez foi no java?
Pelo que eu entendi, seu raciocínio não funciona em java.
Aguardo resposta.
EDIT: Opa, agora que prestei atenção, não tinha notado o 0 (zero) entre aspas simples caracterizando char…
Aí sim é correto…
Abraço!
Fala rafaelczy!
Tente pensar “iterativamente” na solução. A cada iteração você tem um caracter unicode que deve ser tranformado em um dígito numérico (inteiro). Você também pode levar a posição do caractere dentro da String (centenas, dezenas, unidades) para saber o múltiplo correto de 10 a ser utilizado.
Passo 1:
Você tem uma String
“24760”
Passo 2:
Você “quebra” a string em caracteres individuais (Aqui ainda não há numeros, apenas caracteres representando-os)
‘2’, ‘4’, ‘7’, ‘6’, ‘0’
Passo 3:
Você pega a distância do caractere unicode do zero ‘0’ (Exemplo: ‘1’ - ‘0’ = 1) e consegue obter os valores individuais dos dígitos (em valores inteiros)
2, 4, 7, 6, 0
Passo 4:
Agora vem a parte chata, multiplicar os valores acima pela potencia adequada de 10 como o Vingdel falou. Existem outras maneiras de fazer isso mas uma delas é:
2 * 10^4
4 * 10^3
7 * 10^2
6 * 10^1
0 * 10^0
A outra maneira de resolver essa parte é ir multiplicando o resultado da iteração anterior por 10. Depois posta o teu programa aqui pra gente ver.
Vingdel, te mandei uma MP depois dá uma olhada.
Abraços
Marcio
bah acordei de brain novo e vamos pra pauleira de novo
que bostinha dificil essa… mas é a vida…
Marcoy
realmente to boiando ainda no passo 3 descrito por vc! (os outros eu entendi até já consegui implementar)
será q da pra clarear mais o passo 3
valeu
ta ai meu cod
só cosegui evoluir a incialização da var expoente e mais nada
ufss…
String s = "2345";
char[] arrayChar = new char[4];
int[] arrayInt = new int[4];
int inteiro;
int expoente = arrayInt.length -1;
int soma = 0;
for (int i=0; i<=arrayChar.length-1; i++){
arrayChar[i] = s.charAt(i);
arrayInt[i] = arrayChar[i];
inteiro = arrayInt[i]*10^expoente;
expoente-- ;
soma += inteiro;
System.out.println(inteiro);
}
System.out.println("O inteiro e: " + soma);
Tá quente agora!
Na linha 10, mude de:
arrayInt[i] = arrayChar[i];
para:
arrayInt[i] = arrayChar[i] - '0';
O que você está fazendo é movendo a representação numérica do char (exemplo ‘9’ em ascii é 57) e subtraindo a representação numérica do char ‘0’ (48 em ascii). o que dá: 57 - 48 = 9 que é exatamente o valor que queremos. Lembrando que o java usa o UNICODE e não a Tabela ASCII. Mas isso não interfere no resultado do cálculo.
Acho que o seu programa deve funcionar agora. Mas repense a utilização de tantos arrays… Não é necessário nenhum array.
Abraços
Marcio
“O que você está fazendo é movendo a representação numérica do char (exemplo ‘9’ em ascii é 57) e subtraindo a representação numérica do char ‘0’ (48 em ascii). o que dá: 57 - 48 = 9 que é exatamente o valor que queremos”
incrivel, juro, tive de ler isso umas 20 vezez pra cair a ficha, entender a logica do teu exemplo.
eu sabia que meu arrayInt[i] tava recebendo nao o 9 da string mas 57 q é o posição dele na tab unicode, ou referencia, ou sei la o que na unicode. enfim, o que eu jamais iria imaginar era que tem que subtrair o char 0 que na unicode é 48. dai claro, 57 - 48 = 9
eu ficava focado em arrumar um jeito de parar de receber o valor unicode 57 e conseguir receber 9 em inteiro e tu aceitou trabalhar com o que estava recebendo e foi muito flexivel ao adiconar mais um char ainda na operação ( ‘0’ ) pra subtrair do valor unicode do primeiro char e passar esse resto que vira inteiro no arrayInt[i].
notavel
-recebo nao o 9 mas um char que na tab unico vale 57 . certo. será que há entao na unicode algum valor que eu subtraipoosto de 57 e da o resto 9 do tipo char ainda que seja dai meu arrayInt[i] vai guardar o int 9 direitinho-
nunca eu iria pensar assim eu acho.
o que eu quero dizer é que sinto que ainda nao posso ser deixado sozinho pra resolver só com dicas e pistas fornecidas pelo pessoal do forum, ainda que a intenção deles seja das mais nobres em nao dar resposta pra ajudar o beginer como eu a pensar.
Sinto que no inicio pra caras como eu, “entregar” a resposta como tu fez me ajuda a entender que existe um caminho assim.
as vezes simplesmente nao adiante queimar o brain pq nao vai, o carar falta em base essencial.
melho é o cara pegar algumas respostas vai se acostumando mais e depois com apenas pistas e dicas, ai sim, conseguem descobrir tudo.
bom Marcoy captei finalmente, valeu
ainda nao ta funfando
me creio a que parte delicada resolvi e aprendi
agora vou tentar arrumar
e depois fazer o que me parece impossivel: nao usar arrays…
ufssss…
bela sexta feira
rsss
String s = "2345";
char[] arrayChar = new char[4];
int[] arrayInt = new int[4];
int inteiro;
int expoente = arrayInt.length -1;
int soma = 0;
for (int i=0; i<=arrayChar.length-1; i++){
arrayChar[i] = s.charAt(i);
arrayInt[i] = arrayChar[i] - '0';
inteiro = arrayInt[i]*10^expoente;
expoente-- ;
soma += inteiro;
System.out.println(inteiro);
}
System.out.println("O inteiro e: " + soma);
procurei legal e vi varios posts de autores diferentes e uma coisa em comum que me fazia nao compreender todos exemplos de codigos era que tinha que subtrair o ‘0’
inclusive pulei tb do teu exemplo de cod por causa disso.
rsssss
int expoente = arrayInt.length-1; // aqui começa com 3
inteiro = arrayInt[i]*10^expoente; // aqui eu queria implemntar 10 elevado na 3 mas minha instrução nao diz isso.
tenho que implementar diferente a potenciação mas nao to sabendo no java como elevar 10 na potencia de uma var que vale 3 (10 elevado na 3a potencia)
Faz tipo um método de potencia…
public static int potencia(int base, int expoente) {
if (expoente == 0)
return 1;
while (expoente-- > 1)
base*=base;
return base;
}
Aí se quiser pegar 10 elevado a 3 é só chamar:
resultado = Classe.potencia(10, 3);
Cara, tenta obter uma cópia da primeira edição traduzida do livro “C a linguagem de programação”. É um livro fininho, pra ler em uma semana. Mas é uma obra prima em termos de algoritmos. Você sai diferente depois da leitura desse livro porque certas coisas ficam muito mais claras. Tambem tenta dar uma reforçada no aspecto de álgebra e aritmética. E tire os arrays do seu programa. Eles não são necessários.
Abraços
Marcio
Cara, tudo bem que exercita criar um método para potenciação, mas já existe um como eu já citei no tópico.
É o Math.pow(). Mas eu acho mais interessante multiplicar por a cada iteração.
Fiz o método aqui e ficou com 8 linhas, bem simples.
Ai Marcoy valeu a as dicas, vou tentar obter o livro e rever algebra e aritmetica.
Vindgdel posta teu codigo de 8 linhas ai.
abaixo o meu finalmente rodando
o main
String s = "2345";
char[] arrayChar = new char[4];
int[] arrayInt = new int[4];
int inteiro;
int expoente = arrayInt.length-2;
int soma = 0;
for (int i=0; i<=arrayChar.length-1; i++){
arrayChar[i] = s.charAt(i);
arrayInt[i] = arrayChar[i] - '0';
inteiro = arrayInt[i]*Potenciacao.calculaPotenciacao(expoente);
expoente--;
soma += inteiro;
System.out.println(inteiro);
}
System.out.println("O inteiro e: " + soma);
a classe que clacula a potenciação:
public abstract class Potenciacao {
public static int calculaPotenciacao (int num){
int potenciado = 1;
for (int i=0; i<=num; i++){
potenciado = potenciado * 10 ;
}
return potenciado;
}
}
Quem puder ajudar a fazer sem arrays eu agradeço - passando so a teoria ja me serve
abração
Faz tipo um método de potencia…Cara, tenta obter uma cópia da primeira edição traduzida do livro “C a linguagem de programação”. É um livro fininho, pra ler em uma semana. Mas é uma obra prima em termos de algoritmos. Você sai diferente depois da leitura desse livro porque certas coisas ficam muito mais claras. Tambem tenta dar uma reforçada no aspecto de álgebra e aritmética. E tire os arrays do seu programa. Eles não são necessários.
Abraços
Marcio
Os autores são Brian W. Kernighan; Dennis M. Ritchie ? Lançado em 1989
304 paginas ! pra ler numa semana?
caramba nem meu aspirador de pó chupa esse livro em 1 semana…rsss
mas gostei
vou comprar
http://www.extra.com.br/livros/informaticaecertificacao/LinguagemeProgramacao/C-A-Linguagem-de-Programacao-Padrao-ANSI-118084.html?utm_source=buscape&utm_medium=comparadorpreco&utm_campaign=Livros_Linguagem-de-Programacao&cm_mmc=buscape_XML--LIVR--Comparador-_-83657
é esse o livro a que te referes mesmo?
Três versões do mesmo método.
A primeira não faz nenhuma verificação.
A segunda já trata números negativos, entretanto ainda não verifica se o número é válido.
Por fim, a terceira, verifica se a String que está sendo analizada representa de fato um número e caso não seja, lança uma NumberFormatException.
Não comentei os códigos. Faça um teste de mesa para entender o que está acontecendo.
public static int toInt( String n ) {
int valor = 0;
int multiplicador = 1;
char[] c = n.toCharArray();
for ( int i = c.length - 1; i >= 0; i-- ) {
valor += ( ( int ) c[i] - 48 ) * multiplicador;
multiplicador *= 10;
}
return valor;
}
public static int toInt( String n ) {
int valor = 0;
int multiplicador = 1;
int ate = 0;
char[] c = n.toCharArray();
if ( c[0] == '-' ) {
ate = 1;
}
for ( int i = c.length - 1; i >= ate; i-- ) {
valor += ( ( int ) c[i] - 48 ) * multiplicador;
multiplicador *= 10;
}
// se ate for igual a 1, quer dizer
// que o número é negativo
if ( ate == 1 ) {
return -valor;
} else {
return valor;
}
}
public static int toInt( String n ) throws NumberFormatException {
int valor = 0;
int multiplicador = 1;
int ate = 0;
char[] c = n.toCharArray();
if ( c[0] == '-' ) {
ate = 1;
} else if ( c[0] < '0' || c[0] > '9' ) {
throw new NumberFormatException( n + " não é um inteiro!" );
}
for ( int i = c.length - 1; i >= ate; i-- ) {
if ( c[i] < '0' || c[i] > '9' ) {
throw new NumberFormatException( n + " não é um inteiro!" );
}
valor += ( ( int ) c[i] - 48 ) * multiplicador;
multiplicador *= 10;
}
if ( ate == 1 ) {
return -valor;
} else {
return valor;
}
}
[]'s
Faz tipo um método de potencia…Cara, tenta obter uma cópia da primeira edição traduzida do livro “C a linguagem de programação”. É um livro fininho, pra ler em uma semana. Mas é uma obra prima em termos de algoritmos. Você sai diferente depois da leitura desse livro porque certas coisas ficam muito mais claras. Tambem tenta dar uma reforçada no aspecto de álgebra e aritmética. E tire os arrays do seu programa. Eles não são necessários.
Abraços
Marcio
Os autores são Brian W. Kernighan; Dennis M. Ritchie ? Lançado em 1989
304 paginas ! pra ler numa semana?
caramba nem meu aspirador de pó chupa esse livro em 1 semana…rsss
mas gostei
vou comprar
http://www.extra.com.br/livros/informaticaecertificacao/LinguagemeProgramacao/C-A-Linguagem-de-Programacao-Padrao-ANSI-118084.html?utm_source=buscape&utm_medium=comparadorpreco&utm_campaign=Livros_Linguagem-de-Programacao&cm_mmc=buscape_XML--LIVR--Comparador-_-83657é esse o livro a que te referes mesmo?
Não, procure a primeira edição que a tradução é bem melhor. Além disso você acha em sebos bem mais barato.
Aqui ele: http://www.submarino.com.br/produto/1/10410/c:+a+linguagem+de+programacao
Abraços
Marcio
Olá, pessoal!
Como já ví que o rafael_czy conseguiu fazer o código da maneira dele, e mais um amigo resolveu participar do tópico postando algumas ideias de código e até com verificação vou postar o meu, sem verificação, apenas com a conversão básica, aliás, 2 formas que me vieram a mente. Seguem:class StringToInt{
public static void main(String[] args){
String a = "1234";
System.out.print(stringToInt(a));
}
public static int stringToInt(String str){
int inteiro = 0;
for(int i = 0; i < str.length(); i++){
inteiro *= 10;
inteiro += str.charAt(i)-'0';
}
return inteiro;
}
}Outra forma:class StringToInt{
public static void main(String[] args){
String a = "1234";
System.out.print(stringToInt(a));
}
public static int stringToInt(String str){
int inteiro = 0;
int exp = str.length()-1;
for(int i = 0; i < str.length(); i++){
inteiro += ((int)str.charAt(i)-'0')*Math.pow(10,exp--);
}
return inteiro;
}
}
Abraço!
davibuzzato valeu desde q tu postou ate agora estou analizando. ótimo aprendizado essas tres versoes. grato
Vingdel muito interessante: nao usaste nehuma array. vou estudar os teus tb. eu estava querendo ver isso. grato
Marcoy vou visitar um sebos aqui em porto Alegre, espero encontrar!
A todos abração!
Aqui está meu código melhorado, fiz minha forma de validação da string após análise do código do davidbuzzato.
public static int stringToInt(String str) throws NumberFormatException{
int inteiro = 0;
int count = 0;
if(str.charAt(0) == '-')
count = 1;
while(count < str.length()){
if(str.charAt(count) >= '0' && str.charAt(count) <= '9'){
inteiro *= 10;
inteiro += str.charAt(count++)-'0';
}else
throw new NumberFormatException("Para a string entrada: \""+str+"\"");
}
if(str.charAt(0) == '-')
return -inteiro;
return inteiro;
}Abraço!
// pessoal esse codigo converte String para um float inserindo tanto uma virgula quanto um ponto
class Converte{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
String a = input.next();
System.out.printf("%.2f",stringToInt(a));
}
public static float stringToInt(String s){
float inteiro=0;
int cont=0;
int flu = 0;
int um = 1;
if(s.charAt(0)=='-')
cont=1;
while(cont <s.length()){
if(s.charAt(cont)==','||s.charAt(cont)=='.'){
cont++;
for(int i = cont; i><s.length(); i++)
um = um *10;
}
if(s.charAt(cont)>='0' && s.charAt(cont) <= '9'){
inteiro *= 10;
inteiro += s.charAt(cont++)-'0';
}
}
inteiro = inteiro/um;
if(s.charAt(0) == '-')
return -inteiro;
return inteiro;
}
}
andrews360, boa noite!
Bem-vindo ao GUJ, por gentileza, edite sua postagem e coloque seu código entre as tags [code]. Sempre que postar códigos faça dessa forma.
Abraço!