2013-01-07 13 views
7

Eventuali duplicati:
Parsing numbers safely and locale-sensitivelyConvalida numeri decimali in modo locale sensibile in Java

Come posso convalidare stringhe contenenti numeri decimali in modo locale-sensibile? NumberFormat.parse consente troppo e Double.parseDouble funziona solo per le impostazioni locali in inglese. Ecco quello che ho provato:

public static void main(String[] args) throws ParseException { 
    Locale.setDefault(Locale.GERMAN); 

    NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault()); 
    Number parsed = numberFormat.parse("4,5.6dfhf"); 
    System.out.println("parsed = " + parsed); // prints 4.5 instead of throwing ParseException 

    double v = Double.parseDouble("3,3"); // throws NumberFormatException, although correct 
} 
+0

Dovrebbe un'eccezione, se il locale è tedesco, e l'ingresso è '3.3' invece di' 3,3'? – jlordo

+0

'Number parsed = numberFormat.parse (" 4.5.6dfhf ");' funziona anche e produce '456' ... Eurgh ... – assylias

+0

jlordo: almeno dovrebbe accettare i numeri corretti ... – WannaKnow

risposta

2

riguardo del

Number parsed = numberFormat.parse("4,5.6dfhf"); 

problema, è possibile utilizzare NumberFormat.parse (origine String, posizione ParsePosition) e verificare se la posizione in cui è stato interrotto l'analisi era effettivamente l'ultima posizione della stringa.

Inoltre, sul problema 4.5.6, è possibile provare a impostare il raggruppamento tramite setGroupingUsed (boolean newValue) poiché penso che sia un problema prodotto da "." carattere essendo il carattere di raggruppamento sul locale.

Dovrebbe essere qualcosa di simile

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.getDefault()); 
numberFormat.setGroupingUsed(false); 
ParsePosition pos; 
String nString = "4,5.6dfhf"; 

Number parsed = numberFormat.parse(nString, pos); 
if (pos.getIndex() == nString.length()) // pos is set AFTER the last parsed position 
    System.out.println("parsed = " + parsed); 
else 
    // Wrong 
+1

Ma ciò accetterebbe ancora input senza senso come "4.5.6". –

+0

In realtà la condizione if (nString.length() == pos.getIndex()) (senza sottrarre una lunghezza) sembra essere la condizione giusta – WannaKnow

+0

Andreas_D: Immagino che i punti siano semplicemente ignorati, proprio come le virgole vengono ignorate per l'inglese locale – WannaKnow

1

Dal tuo commento di cui sopra, è possibile utilizzare:

String input = "3,3"; // or whatever you want 
boolean isValid = input.matches("^\\d+([.,]\\d+)?$"); 
double value = Double.parseDouble(input.replaceAll(",", ".")); 

Se il separatore può essere qualcosa di altro oltre la virgola, è sufficiente aggiungere nelle parentesi quadre:

double value = Double.parseDouble(input.replaceAll("[,]", ".")); 
+0

Il problema è che non è garantito che il locale sia tedesco. Potrebbe essere qualsiasi cosa. Pensi che ciò funzionerebbe per qualsiasi locale? – WannaKnow

+0

Finché il separatore è un punto o una virgola, funzionerà.Non conosco una localizzazione, dove il separatore è qualcos'altro. – jlordo

+0

Che dire di spazi? '1 000 000' è probabilmente valido in alcuni locali. Tentativo di riqualificare una localizzazione- parser dipendente suona come un gioco pericoloso ... – assylias

Problemi correlati