Problema de lógica no substring [RESOLVIDO]

Galera estou com um problema na lógica do meu programa e até então não consegui uma solução abaixo o trecho do problema:

[code]
codigo = (String)cbx_EmAtendimento.getSelectedItem(); // o item selecionado vira String

			if (cbx_EmAtendimento.getSelectedItem()!= null)
			{
				int i = 5; // representa 99.999 em inteiro no substring 
				boolean inteiro = false; // supondo que o id pegado seja false
				
				while(inteiro == false) 
				{
					id = Integer.parseInt(codigo.substring(0,i)); //pega os 5 primeiros caracteres
				
					if (id / id == 1){//se o id for divisivel por ele mesmo e um numero inteiro entao retorne true
							inteiro = true; // sai do loop while
					}
					i--; // se nao diminua um do i pra usar no substring
				}
				}[/code]

o seguinte erro é dado

[code]
Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: “14 =>”
at java.lang.NumberFormatException.forInputString(Unknown Source)

Ele pega os 5 primeiros caracteres 14 =>

minha intenção era que mesmo com o erro dado no if de ele ser uma String, ele continuasse no loop do while até pegar o número 14…
aceito várias sujestões :smiley:

Estou fazendo um mini programa de abertura de chamados ta ficando legalzin hehhee…

[quote=tiagotgd29]Galera estou com um problema na lógica do meu programa e até então não consegui uma solução abaixo o trecho do problema:

codigo = (String)cbx_EmAtendimento.getSelectedItem(); // o item selecionado vira String
				
				if (cbx_EmAtendimento.getSelectedItem()!= null)
				{
					int i = 5; // representa 99.999 em inteiro no substring 
					boolean inteiro = false; // supondo que o id pegado seja false
					
					while(inteiro == false) 
					{
						id = Integer.parseInt(codigo.substring(0,i)); //pega os 5 primeiros caracteres
					
						if (id / id == 1){//se o id for divisivel por ele mesmo e um numero inteiro entao retorne true
								inteiro = true; // sai do loop while
						}
						i--; // se nao diminua um do i pra usar no substring
					}
					}

o seguinte erro é dado

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "14 =>"
	at java.lang.NumberFormatException.forInputString(Unknown Source)

Ele pega os 5 primeiros caracteres  14 =>

minha intenção era que mesmo com o erro dado no if de ele ser uma String, ele continuasse no loop do while até pegar o número  14...
aceito várias sujestões  :D 

Estou fazendo um mini programa de abertura de chamados ta ficando legalzin hehhee....

[/quote]

Olá, é bem facil de entender, veja:

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "14 =>" 
at java.lang.NumberFormatException.forInputString(Unknown Source) 

você esta tentando converter da posição 0 até a 5 o valor

ou seja, você nao pode converter dados que nao sejam integer, o erro esta exatamente na linha 10 do seu codigo

Alguma sugestão ,porque eu já estava contando com esse erro =… estava pensando que ainda assim ele continuaria no loop até o id pegar o inteiro 14 = )

Tiago, qual a sua real necessidade ?
Que tipo de String você tem que manipular e extrair que tipo de valor ?

Se quiseres uma validação, para saber se a String em questão possui somente dígitos, um regex bem simples resolve:

boolean isDigit = suaString.matches("\\d+");

Se retornar true, possui somente dígitos e podes usar o Integer.parseInt() tranquilamente.

nel, não fui muito claro vou tentar explicar melhor

eu tenho um JComboBox que exibe uma lista de funcionarios que estão em atendimento

Eu deixei a lista pra vir assim

id => data | usuario | departamento | resumo | problema

onde ficaria assim

14 => 21 de fevereiro de 2012 | tiago | TI | teste | software

eu preciso pegar o 14 para ou qualquer numero que apareça no id, pois nele eu uso de base para buscar no bando de dados e setar as informações na tela…

o código do JComboBox que funcionava antes era assim:

String codigo = "";
				int id = 0;
				codigo = (String)cbx_EmAtendimento.getSelectedItem(); // o item selecionado vira String
				
				if (cbx_EmAtendimento.getSelectedItem()!= null)
				{

						id = Integer.parseInt(codigo.substring(0,2)); 
					

				try {
						String sql = "SELECT * FROM ocorrencias WHERE id = "+id;
					
						manu.st = manu.connection.createStatement();
						manu.rs = manu.st.executeQuery(sql);
				
						if (manu.rs.next())
						{
							tx_Contato.setText(manu.rs.getString("contato"));
							tx_Data_Resgistrada.setText(manu.rs.getString("data"));
							tx_Depart.setText(manu.rs.getString("departamento"));
							tx_Problema.setText(manu.rs.getString("problema"));
							tx_Ramal.setText(manu.rs.getString("ramal"));
							tx_Resumo.setText(manu.rs.getString("resumo"));
							tx_Status.setText(manu.rs.getString("status"));
							tx_Solicitante.setText(manu.rs.getString("solicitante"));
							txa_Desc.setText(manu.rs.getString("descricao"));
							tx_Cod.setText(manu.rs.getString("id"));
							lbl_ApareceNome.setText(manu.rs.getString("responsavel"));
						}
					}catch(SQLException erro){
						erro.printStackTrace();
					}
				}	
				else
				{
					tx_Contato.setText("");
					tx_Data_Resgistrada.setText("");
					tx_Depart.setText("");
					tx_Problema.setText("");
					tx_Ramal.setText("");
					tx_Resumo.setText("");
					tx_Status.setText("");
					tx_Solicitante.setText("");
					txa_Desc.setText("");
					tx_Cod.setText("");
					lbl_ApareceNome.setText("");
				}
			}

		});

só que ele pegaria os dois primeiros valores ou seja de 10 a 99
quando aparecesse um funcionario em atendimento com o codigó 2 ou 112
daria erro …

ai eu tente implementar esse while:


String codigo = "";
				int id = 0;
				codigo = (String)cbx_EmAtendimento.getSelectedItem(); // o item selecionado vira String
				
				if (cbx_EmAtendimento.getSelectedItem()!= null)
				{
					int i = 5; // representa 99.999 em inteiro no substring 
					boolean inteiro = false; // supondo que o id pegado seja false
					
					while(inteiro == false) 
					{
						id = Integer.parseInt(codigo.substring(0,i)); //pega os 5 primeiros caracteres
					
						if (id / id == 1){//se o id for divisivel por ele mesmo e um numero inteiro entao retorne true
								inteiro = true; // sai do loop while
						}
						i--; // se nao diminua um do i pra usar no substring
					}
					
					
					
				try {
						String sql = "SELECT * FROM ocorrencias WHERE id = "+id;
					
						manu.st = manu.connection.createStatement();
						manu.rs = manu.st.executeQuery(sql);
				
						if (manu.rs.next())
						{
							tx_Contato.setText(manu.rs.getString("contato"));
							tx_Data_Resgistrada.setText(manu.rs.getString("data"));
							tx_Depart.setText(manu.rs.getString("departamento"));
							tx_Problema.setText(manu.rs.getString("problema"));
							tx_Ramal.setText(manu.rs.getString("ramal"));
							tx_Resumo.setText(manu.rs.getString("resumo"));
							tx_Status.setText(manu.rs.getString("status"));
							tx_Solicitante.setText(manu.rs.getString("solicitante"));
							txa_Desc.setText(manu.rs.getString("descricao"));
							tx_Cod.setText(manu.rs.getString("id"));
							lbl_ApareceNome.setText(manu.rs.getString("responsavel"));
						}
					}catch(SQLException erro){
						erro.printStackTrace();
					}
				}	
				else
				{
					tx_Contato.setText("");
					tx_Data_Resgistrada.setText("");
					tx_Depart.setText("");
					tx_Problema.setText("");
					tx_Ramal.setText("");
					tx_Resumo.setText("");
					tx_Status.setText("");
					tx_Solicitante.setText("");
					txa_Desc.setText("");
					tx_Cod.setText("");
					lbl_ApareceNome.setText("");
				}
			}

		});

pra tentar pegar o valor certo do id não importando o tamanho que aparecesse…

espero que tenham entendido pois n sou muito bom pra explicar rssss

Não entendi 100%, então…

Isso:

14 => 21 de fevereiro de 2012 | tiago | TI | teste | software

É uma String ou uma Lista ?
Podes mostrar uma variavél (ou várias) que guardem esses valores ? :slight_smile:

[quote=tiagotgd29]Galera estou com um problema na lógica do meu programa e até então não consegui uma solução abaixo o trecho do problema:

[code]
codigo = (String)cbx_EmAtendimento.getSelectedItem(); // o item selecionado vira String

			if (cbx_EmAtendimento.getSelectedItem()!= null)
			{
				int i = 5; // representa 99.999 em inteiro no substring 
				boolean inteiro = false; // supondo que o id pegado seja false
				
				while(inteiro == false) 
				{
					id = Integer.parseInt(codigo.substring(0,i)); //pega os 5 primeiros caracteres
				
					if (id / id == 1){//se o id for divisivel por ele mesmo e um numero inteiro entao retorne true
							inteiro = true; // sai do loop while
					}
					i--; // se nao diminua um do i pra usar no substring
				}
				}[/code]

o seguinte erro é dado

[code]
Exception in thread “AWT-EventQueue-0” java.lang.NumberFormatException: For input string: “14 =>”
at java.lang.NumberFormatException.forInputString(Unknown Source)

Ele pega os 5 primeiros caracteres 14 =>

minha intenção era que mesmo com o erro dado no if de ele ser uma String, ele continuasse no loop do while até pegar o número 14…
aceito várias sujestões :smiley:

Estou fazendo um mini programa de abertura de chamados ta ficando legalzin hehhee…[/quote]

se você quer que continue “loopando” mesmo que de o erro, coloque um bloco try catch na linha que você chama o parseInt, onde da o erro, isso seria chamado de “tratar o erro”.

qualquer número dividido por ele mesmo vai resultar 1, sempre, isso é matemática mesmo, não tenho certeza se você fez o que queria fazer no if…

“se” a variável que tem esse número é um int, então esse número sempre vai ser um inteiro, mas se você quisesse saber se determinado número é inteiro então você poderia converter esse número para double, dividir por um double com valor 1 e ver se o resultado é igual a 0… é importante você usar duas variáveis de um tipo ponto flutuante, nesse caso o double nesta operação por que senão você não terá a parte fracionária. Não vejo onde isso entraria na sua lógica peloq ue entendi…

Isto é uma lista que pode conter varios valores
este é de exemplo:

14 => 21 de fevereiro de 2012 | tiago | TI | teste | software

os valores são diferente apenas continuam constantes as String que concatenei ex:

=> | | |

Depois que eu tenho o valor na lista do combobox eu transformo em String e tento pegar o primeiro valor que é o ID no caso deste ai é o 14 mais poderia ser qualquer outro numero =)

Cara, eu entendi o que voce está querendo fazer…isso tem moh cheiro de gambiarra!!rsrsrs

eu fazia dessa maneira, eu concatenava o ID na minha combobox e depois pegava via substring
antes de colocar o ID na combobox, eu primeiro verificava o seguinte
qual o tamanho do ID?

  • se for um, coloque um: 0001 (tres zeros)
  • se for dois, coloque um: 0016 (dois zeros)
    assim por diante

mas isso é um…errrr…artificio…hehehe
então eu pesquisando, fiz dessa maneira:


:smiley:

maior_abandonado, a gente ta começando a se entender rss… entao se eu colocar o try catch na onde eu converto com parseint ele ainda vai continua no loop do while mesmo com o erro do if ?

então minha lógica é essa suponha que o a string codigo seja está:

14 => 21 de fevereiro de 2012 | tiago | TI | teste | software

pegando os 5 primeiros caracteres eu teria 14 =>

ai o loop ira decrecendo 1 até chegar a 14/14 = 1 … ai seria true…

agora acho q me expliquei melhor =D

[quote=tiagotgd29]Isto é uma lista que pode conter varios valores
este é de exemplo:

14 => 21 de fevereiro de 2012 | tiago | TI | teste | software

os valores são diferente apenas continuam constantes as String que concatenei ex:

=> | | |

Depois que eu tenho o valor na lista do combobox eu transformo em String e tento pegar o primeiro valor que é o ID no caso deste ai é o 14 mais poderia ser qualquer outro numero =)[/quote]

Veja o que eu fiz de acordo com o que entendi e se supri sua necessidade:

	String s = "14 => 21 de fevereiro de 2012 | tiago | TI | teste | software";
		int index = s.indexOf("=>");
		String id = s.substring(0, index);
		System.out.println(id);

Imprimiu: 14

Esse código é independente do tamanho do ID, vai simplesmente pegar qualquer coisa que venha antes de ‘=>’.
Abraços.

cara vou fazer o teste aqui e posto se funcionou, eu não conhecia o indexOf =] . .

:smiley: nel, deu certo !!

ficou assim :

if (cbx_AguardandoAtendimento.getSelectedItem()!= null)
				{
					String codigo = (String)cbx_AguardandoAtendimento.getSelectedItem(); 
					int index = codigo.indexOf(" =>");
					
					int id = Integer.parseInt(codigo.substring(0, index));
				
					try {
						String sql = "SELECT * FROM ocorrencias WHERE id = "+id;
					
						manu.st = manu.connection.createStatement();
						manu.rs = manu.st.executeQuery(sql);
				
						if (manu.rs.next())
						{
							tx_Contato.setText(manu.rs.getString("contato"));
							tx_Data_Resgistrada.setText(manu.rs.getString("data"));
							tx_Depart.setText(manu.rs.getString("departamento"));
							tx_Problema.setText(manu.rs.getString("problema"));
							tx_Ramal.setText(manu.rs.getString("ramal"));
							tx_Resumo.setText(manu.rs.getString("resumo"));
							tx_Status.setText(manu.rs.getString("status"));
							tx_Solicitante.setText(manu.rs.getString("solicitante"));
							txa_Desc.setText(manu.rs.getString("descricao"));
							tx_Cod.setText(manu.rs.getString("id"));
							lbl_ApareceNome.setText(manu.rs.getString("responsavel"));
						}
					}catch(SQLException erro){
						erro.printStackTrace();
					}
				}	
				else
				{
					tx_Contato.setText("");
					tx_Data_Resgistrada.setText("");
					tx_Depart.setText("");
					tx_Problema.setText("");
					tx_Ramal.setText("");
					tx_Resumo.setText("");
					tx_Status.setText("");
					tx_Solicitante.setText("");
					txa_Desc.setText("");
					tx_Cod.setText("");
					lbl_ApareceNome.setText("");
				}
			}

Agora ta balinha 8) … estava me matando a toa hehehe isso que dá ser novato o indexOf é mais um pra coleção

valew todo mundo aew pela ajuda !!

Excelente.

Apenas edita o seu tópico para adicionar [Resolvido] nele e dá uma lida na String do Java 7. O javadoc é bem útil.

Isso ai, a cada dia aprendemos coisas novas.
Abraços Tiago.

Abraços, o GUJ é minha página java pra dúvidas agora = ) !