Boa noite a todos. Estou a fazer um método que verifica se os caracteres digitados são válidos conforme a tabela ASCII http://www.acasadojava.com.br/tabela-ascii.aspx?idioma=pt só que ele retorna true apenas para os valores entre 65 e 90. Todos os valores estão entre parenteses antecedidos de ! não seria suficiente para dizer que caso não seja um dos valores listados retorne falso.
Onde está o erro? public static boolean isNomeValido(String texto) {
for (int i = 0; i < texto.length(); i++) {
int valor = (int) texto.toUpperCase().charAt(i);
if (!((valor >= 65 && valor <= 90) || (valor >= 224 && valor <= 228) || (valor >= 231 && valor <= 239) || (valor >= 241 && valor <= 246) || (valor >= 249 && valor <= 253) || valor == 32 || valor == 39 || valor == 255)) {
return false;
}
}
if (texto.length() > 0) {
return true;
} else {
return false;
}
}
Assim também não funciona public static boolean isNomeValido(String texto) {
for (int i = 0; i < texto.length(); i++) {
int valor = (int) texto.toUpperCase().charAt(i);
if ((valor >= 65 && valor <= 90) == false || (valor >= 224 && valor <= 228)==false || (valor >= 231 && valor <= 239)==false || (valor >= 241 && valor <= 246)==false || (valor >= 249 && valor <= 253)==false || valor != 32 || valor != 39 || valor != 255) {
return false;
}
}
if (texto.length() > 0) {
return true;
} else {
return false;
}
}
Ninguém?
[code]public static boolean isNomeValido(String texto) {
if (texto.length() == 0) {
return false;
}
for (char letra : texto.toUpperCase().toCharArray()) {
if (!(letra >= 65 && letra <= 90) &&
!(letra >= 224 && letra <= 228) &&
!(valor >= 231 && valor <= 239) &&
!(valor >= 241 && valor <= 246) &&
!(valor >= 249 && valor <= 253) &&
valor != 32 && valor != 39 && valor != 255
) {
return false;
}
}
return true;
}[/code]
Você precisa que verifique se é ASCII ou quer converter para ASCII?
Se quiser converter é
String s = "Hello, world!";
byte[] b = s.getBytes(Charsets.US_ASCII);
Além disso esse método retorna
UnsupportedEncodingException
caso o encode não bata com o valor da String
Por enquando eu só quero verificar mesmo o usuário digita um nome e se ele tiver algum caracter irregular retorna false.
Eu admito ter feito uma crtl+c crtl+v do vini mas não sei se do jeito que eu estou testando está errado mas a resposta ainda não fica correta eu já estou a mais de duas horas fazendo esse exercício e não sai nada.[code]
public class NewMain {
public static void main(String[] args) {
int a = (int) 'à';
System.out.println(a);
System.out.println(isNomeValido("áaäA"));// retornar true
System.out.println(isNomeValido("@!"));// retornar false
}
public static boolean isNomeValido(String texto) {
if (texto.length() == 0) {
return false;
}
for (char letra : texto.toUpperCase().toCharArray()) {
if (!(letra >= 65 && letra <= 90)
&& !(letra >= 224 && letra <= 228)
&& !(letra >= 231 && letra <= 239)
&& !(letra >= 241 && letra <= 246)
&& !(letra >= 249 && letra <= 253)
&& letra != 32 && letra != 39 && letra != 255) {
return false;
}
}
return true;
}
}[/code]A saída:
224
false
false
Mandei imprimir o código ascii das letras, e vi onde está seu erro.
Se você está convertendo tudo para maiúscula, por que colocou em seu if o intervalo das letras minúsculas?
Não é porque tem acento, que o Java não vai converter para maiúscula também.
Segue o código corrigido.
[code]public class NewMain {
public static void main(String[] args) {
System.out.println(isNomeValido("áaäAç"));// retornar true
System.out.println(isNomeValido("@!"));// retornar false
}
public static boolean isNomeValido(String texto) {
if (texto.length() == 0) {
return false;
}
for (char letra : texto.toUpperCase().toCharArray()) {
System.out.printf("%s %d%n", letra, (int) letra);
//@formatter:off
if (! (letra >= 65 && letra <= 90 ||
letra >= 199 && letra <= 207 ||
letra >= 241 && letra <= 246 ||
letra >= 209 && letra <= 213 ||
letra >= 192 && letra <= 196 ||
letra == 32 || letra == 39)) {
return false;
}
//@formatter:on
}
return true;
}
}[/code]
Uma dica, é sempre bom imprimir exatamente o que será comparado para você poder ver se é o que você espera mesmo.
Usar o depurador te daria exatamente a resposta para o problema.
Obrigado, vou seguir sua dica esse tipo de erro não irá se repetir. :thumbup:
Tópico resolvido.