Domanda

Ho il seguente codice per analizzare una chiamata str variabile String.

NumberFormat formatter = NumberFormat.getInstance();
Number number = formatter.parse(str);

Voglio cogliere l'eccezione generata quando str non è un numero solo per convalidarlo. Il problema che ho è che does't sempre getta il ParseException previsto. Quando la stringa str inizia con un numero, ma poi sono personaggi sembra avere un i primi caratteri della stringa e analizzare come un numero.

Ad esempio:

  • se str = "A10", allora è gettato ParseException
  • se str = "10 bis", allora non fa eccezione gettata e il numero = 10

Non posso usare Double.parseDouble (str) str perché possono avere virgole e punti simili 1,000.98 e questo formato non è compreso dalla presente metodo.

Perché succede questo? Posso convalidare in altro modo? Grazie

È stato utile?

Soluzione

Il comportamento non è strano, è come progettato

  

Analizza il testo all'inizio della stringa data per produrre un numero. Il metodo non può utilizzare l'intero testo della stringa data.

È possibile utilizzare il metodo di analisi di posizione-aware in questo modo:

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

Altri suggerimenti

Se si guarda al API , si dice chiaramente:

  

analizza il testo all'inizio del   data stringa per produrre un numero. Il   metodo non può utilizzare l'intero testo   la stringa data.

Se volete vedere fino a che punto il parser analizzato, è possibile utilizzare il altra posizione consapevole metodo . In questo modo è possibile controllare se avete dei caratteri finali. Si potrebbe anche verificare l'intera stringa di caratteri alfanumerici che utilizzano ad esempio Langs comuni isalpha .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top