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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top