Concatenar int

Olá pessoal,

Estou iniciando em Java, com apostila da Caelum.

Estou tentando fazer o seguinte exercicio:

[quote]Converta uma String para um número sem usar as bibliotecas do java que já fazem isso. Isso é, uma String x = “762” deve gerar um int i = 762.
Para ajudar, saiba que um char pode ser “transformado” em int com o mesmo valor numérico fazendo:
char c = ‘3’;
int i = c - ‘0’; // i vale 3!
Aqui estamos nos aproveitando do conhecimento da tabela unicode: os números de 0 a 9 estão em sequência! Você poderia usar o método estático Character.getNumericValue(char) em vez disso.[/quote]

Okay então com esse codigo abaixo eu pego a 1 posição da string como valor numerico:

Character.getNumericValue(c.charAt(0));

Tem algum metodo que eu possa dps de pegar as 3 posições, eu possa concatena-lás para jogar em uma int.

Se não for assim alguem me diz como é, please

Você consegue pegar o valor numérico do caractere, mas você ainda tem que saber qual é a unidade, a dezena, a centena, etc…

Essas coisas aí você não vai ter como evitar, vai ter que resolver :slight_smile:

Oi rodrigo,

Quando vc se explicou pensei no codigo abaixo, tinha ki ser assim msm, não tinha jeito mais facil ?

Eu coloquei uma Exception que não funcinou, não era certa para o que eu queria, como eu faço pra ele rodar só se o atributo s tiver somente numeros?

Se tiver alguma letra ele não tratar.

[code]public class Tint {

String s;

public Tint(String s) {
	this.s = s;
}

public int convertendo() {
	try {
		int r = 0;
		int c = 0;
		for (int x = this.s.length()- 1; x >= 0; x--) {
			r += Character.getNumericValue(this.s.charAt(x))* Math.pow(10, c);
			c++;
		}

		return r;
	} catch (java.lang.ClassCastException e) {
		System.out.println("Tipo de Dado não esperado");
		return 0;
	}
}

}
}[/code]

Infelizmente, no seu caso, todos os chars tem um valor numérico válido. Então ele buscará o valor de qualquer caractere que você enviar para ele.

O que você pode fazer é verificar se essa String está no formato que você quer, pode encapsular isso em um método, tentando converter ou usando expressões regulares (que dependendo do caso deixa as coisas bem complexas).

Antes de tudo isso você precisa definir o que é um número. Como no seu caso você retorna um int, então podemos deduzir que serão considerados como números, somente números inteiros. Então você pode fazer algo assim:private boolean isNumber(String number){ try{ Integer.parseInt(number); return true; catch(NumberFormatException e){ return false; } }E com esse método você descobre se a String informada contém um número válido ou não.

Veja:
1234 = 1x1000 + 2x100 + 3x10 + 4x0

Ou então:
1234 = 1x10x10x10 + 2x10x10 + 3x10 + 4

Ou ainda:
1234 = ((((((1)x10)+2)x10)+3)x10)+4

[quote=ViniGodoy]Veja:
1234 = 1x1000 + 2x100 + 3x10 + 4x0

Ou então:
1234 = 1x10x10x10 + 2x10x10 + 3x10 + 4
[/quote]
A chamada que ela faz a Math.pow a cada iteração já não resolve isso?

[quote=Rodrigo Sasaki][quote=ViniGodoy]Veja:
1234 = 1x1000 + 2x100 + 3x10 + 4x0

Ou então:
1234 = 1x10x10x10 + 2x10x10 + 3x10 + 4
[/quote]
A chamada que ela faz a Math.pow a cada iteração já não resolve isso?[/quote]

Sim, resolve… mas há outras formas mais eficientes de pensar no problema. Basta perceber que cada multiplicação por 10 “afasta” o número para a esquerda.

public class ConversorDeString {
private String num;

public ConversorDeString(String s) {
	this.num = s;
}

public ConversorDeString() {

}

public int forInteger() {
	int num = 0;
	int numInt = 0;
	int casas = 1;
	for (int x = 0; x < this.num.length() - 1; x++) {
		casas *= 10;
	}
	for (int i = 0; i < this.num.length(); i++) {
		num = Character.getNumericValue(this.num.charAt(i));
		num = num * casas;
		numInt += num;
		casas /= 10;
	}
	return numInt;
}

}

[quote=JoiceFogaça]Oi rodrigo,

Quando vc se explicou pensei no codigo abaixo, tinha ki ser assim msm, não tinha jeito mais facil ?

Eu coloquei uma Exception que não funcinou, não era certa para o que eu queria, como eu faço pra ele rodar só se o atributo s tiver somente numeros?

Se tiver alguma letra ele não tratar.

[code]public class Tint {

String s;

public Tint(String s) {
	this.s = s;
}

public int convertendo() {
	try {
		int r = 0;
		int c = 0;
		for (int x = this.s.length()- 1; x >= 0; x--) {
			r += Character.getNumericValue(this.s.charAt(x))* Math.pow(10, c);
			c++;
		}

		return r;
	} catch (java.lang.ClassCastException e) {
		System.out.println("Tipo de Dado não esperado");
		return 0;
	}
}

}
}[/code][/quote]

Olha vou te falar minha opinião que é a seguinte,
existem jeitos mais simples de fazer algumas coisas desse tipo.
Um tempo atrás eu estava vendo umas coisas igual você está
mostrando aqui também mas depois notei que tem algumas
coisas que são muito complexas e difíceis de usar
e se pesar bem talvez tenha 1% de chance apenas de ter que usar.

Por isso essa é minha opinião.
Mas fica a vontade de cada um querer ou não explorar as coisas.

Para mim o velho Cast ou então o velho estilo Integer.parseInt

Abraço.

[quote=JavaDreams][quote=JoiceFogaça]Oi rodrigo,

Quando vc se explicou pensei no codigo abaixo, tinha ki ser assim msm, não tinha jeito mais facil ?

Eu coloquei uma Exception que não funcinou, não era certa para o que eu queria, como eu faço pra ele rodar só se o atributo s tiver somente numeros?

Se tiver alguma letra ele não tratar.

[code]public class Tint {

String s;

public Tint(String s) {
	this.s = s;
}

public int convertendo() {
	try {
		int r = 0;
		int c = 0;
		for (int x = this.s.length()- 1; x >= 0; x--) {
			r += Character.getNumericValue(this.s.charAt(x))* Math.pow(10, c);
			c++;
		}

		return r;
	} catch (java.lang.ClassCastException e) {
		System.out.println("Tipo de Dado não esperado");
		return 0;
	}
}

}
}[/code][/quote]

Olha vou te falar minha opinião que é a seguinte,
existem jeitos mais simples de fazer algumas coisas desse tipo.
Um tempo atrás eu estava vendo umas coisas igual você está
mostrando aqui também mas depois notei que tem algumas
coisas que são muito complexas e difíceis de usar
e se pesar bem talvez tenha 1% de chance apenas de ter que usar.

Por isso essa é minha opinião.
Mas fica a vontade de cada um querer ou não explorar as coisas.

Para mim o velho Cast ou então o velho estilo Integer.parseInt

Abraço.[/quote]
Você leu o enunciado do exercício? Ele diz claramente que

Por isso, como você vai fazer para usar o Integer.parseInt se o enunciado é claro em dizer que ele não deve ser utilizado?
Na boa, quer somar respostas, contribua com coisas úteis, responda tópicos que não foram respondidos, ao invés de falar bobagens como esta ou, no mínimo, dê-se ao trabalho de analisar de forma adequada o problema, entenda todo o contexto e então forneça uma resposta que agregue algum valor à discussão.

Consegui fazer desta forma:

public class StringToInt {

    public static void main(String[] args) {

        String s = "7682"; \\podendo alterar esse número para qualquer outro
        int num = 0;
        int total = 0;

        for (int i = s.length() - 1; i >= 0; i--) {   
          
            num = Character.getNumericValue(s.charAt(i));
            int var = s.length() - i;

            while (var > 1) {
                num = num * 10;
                var--;
            }

            total = num + total;

        }

        System.out.println(total);

    }
}