[RESOLVIDO] Método ASCII

7 respostas
Onimatsu

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; } }

7 Respostas

Onimatsu

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; } }

Onimatsu

Ninguém?

ViniGodoy
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;
}
vtr002

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

Onimatsu
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.
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;
    }
}
A saída: 224 false false
ViniGodoy

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.

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;
    }
}

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.

Onimatsu

Obrigado, vou seguir sua dica esse tipo de erro não irá se repetir. :thumbup:
Tópico resolvido.

Criado 29 de março de 2013
Ultima resposta 30 de mar. de 2013
Respostas 7
Participantes 3