2013-04-04 15 views
5

Non capisco qualcosa in NumberFormat, nel locale USA si suppone di trattare comma (",") come un separatore di gruppo - per migliaia.Java NumberFormat ignora la virgola nelle impostazioni locali statunitensi?

Perché ignora le virgole in luoghi non corretti per questo locale?

NumberFormat format = DecimalFormat.getInstance(Locale.US); 
System.out.println(format.parse("5,500").longValue()); //5500 
System.out.println(format.parse("550,0").longValue()); //5500 
System.out.println(format.parse("5500,").longValue()); //5500 

altre idee su come analizzare la stringa a lungo in base alla localizzazione (asumming che l'ingresso di "" in luoghi non corretti per il locale dovrebbe fallire)?

+0

Cosa intendi quando dici * luogo errato *? Tutte le dichiarazioni sul tuo esempio sono valide. –

+0

Prova 'format.setGroupingUsed (true)'. Fa la differenza? – Puce

+0

@Puce: il valore predefinito è 'true' per' Locale.US'. – Keppil

risposta

0

La virgola è un segnaposto per il separatore di raggruppamento e il punto è un segnaposto per il separatore decimale.

NumberFormat format = DecimalFormat.getInstance(Locale.US); 
System.out.println(format.parse("5.500").longValue()); //5 
System.out.println(format.parse("55.00").longValue()); //55 
System.out.println(format.parse("550.0").longValue()); //550 

La virgola viene ignorata a partire dalla presentazione. Il contratto utilizzato per migliaia è comune ma non ha alcuna rappresentazione durante l'analisi. Questo è il motivo per cui è chiamato separatore di raggruppamento non separatore di migliaia. Potresti avere qualcosa come 5,5.0,0, e sarà ancora valido.

Il modo in cui le cifre sono raggruppate può essere diverso, a volte è di 3 cifre un tempo di 2 o combinato.

Logicamente parlando se è solo il separatore che viene utilizzato per semplificare la lettura da parte degli esseri umani. La sua posizione non cambia il valore del numero presentato, quindi può essere omesso.


L'analisi di classe java.text.DecimalFormat attuato da Oracle mostra che i caratteri di raggruppamento vengono ignorati.

1526 // Ignore grouping characters, if we are using them, but 
1527 // require that they be followed by a digit. Otherwise 
1528 // we backup and reprocess them. 

Per ulteriori visita Formatting Numeric Print Output

+1

Lo afferma nella domanda, penso che voglia che l'analisi fallisca se la virgola è in il posto sbagliato – Keppil

+0

Lui non vuole quello, lui vuole sapere cosa non sta cadendo. Ho aggiunto qualche commento a questo. –

+0

come diceva Keppil, volevo che questo fallisse se il raggruppamento non è corretto (a seconda delle impostazioni locali) - se è possibile a tutti – Yoni

-1

Come la virgola è un separatore per le migliaia negli Stati Uniti Locale, viene ignorato quando è erroneamente collocato. Tutti questi output stamperanno 5500.

+1

Lo dice nella domanda, penso che voglia che l'analisi fallisca se la virgola è nel posto sbagliato. – Keppil

0

Come ricorda javadev, il metodo parse sembra ignorare migliaia di separatori. Immagino che dovresti implementare un metodo di analisi da solo (usando le informazioni di NumberFormat/DecimalFormat) se vuoi un'analisi rigorosa.