Comportamento estranho do número de formação java
-
20-09-2019 - |
Pergunta
Eu tenho o seguinte código para analisar uma variável de string chamada str.
NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);
Quero pegar a exceção jogada quando o STR não é um número apenas para validá -lo. O problema que tenho é que ele nem sempre lança a parseexception esperada. Quando o String STR começa com um número, mas são caracteres, parece obter um primeiro caractere da string e analisá -los como um número.
Por exemplo:
- Se str = "A10", então é jogado uma parseexception
- Se str = "10a", então nenhuma exceção jogada e número = 10
Não posso usar duplo.parsedouble (str) porque o STR pode ter vírgulas e pontos como 1.000,98 e esse formato não é entendido por esse método.
Por que isso está acontecendo? Posso validar de outra maneira? Obrigado
Solução
O comportamento não é estranho, é como projetado
Paresia o texto desde o início da string dada para produzir um número. O método não pode usar o texto inteiro da string fornecida.
Você pode usar o método de análise com reconhecimento de posição como este:
public static double parse(String str) throws ParseException {
NumberFormat formatter = NumberFormat.getInstance();
ParsePosition position = new ParsePosition(0);
Number number = formatter.parse(str, position);
if (position.getIndex() != str.length()) {
throw new ParseException("failed to parse entire string: " + str, position.getIndex());
}
return number.doubleValue();
}
Outras dicas
Se você olhar para o API, diz claramente:
Paresia o texto desde o início da string dada para produzir um número. O método não pode usar o texto inteiro da string fornecida.
Se você quiser ver até que ponto o analisador analisou, você pode usar o Outro método com reconhecimento de posição. Dessa forma, você pode verificar se tem algum chars à direita. Você também pode verificar a corda inteira quanto a chars alfanuméricos usando, por exemplo, comuns Isalpha.