2013-04-04 8 views
5

Nie rozumiem czegoś w NumberFormat, w US locale należy traktować przecinek (",") jako separator grup - na tysiące.Java NumberFormat ignorowanie przecinka w locale w USA?

Dlaczego ignoruje przecinki w niewłaściwych miejscach dla tych ustawień narodowych?

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 

jakieś inne pomysły jak analizować ciąg do Longa według lokalizacji (asumming że wejście „” w niewłaściwych miejscach dla lokalizacji powinna fail)?

+0

Co masz na myśli mówiąc "nieprawidłowe miejsce"? Wszystkie stwierdzenia na twoim przykładzie są prawidłowe. –

+0

Wypróbuj 'format.setGroupingUsed (true)'. Czy to robi różnicę? – Puce

+0

@Puce: Domyślnym ustawieniem jest 'true' dla' Locale.US'. – Keppil

Odpowiedz

0

Przecinek jest symbolem zastępczym dla separatora grupującego, a kropka jest symbolem zastępczym dla separatora dziesiętnego.

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 

Przecinek jest ignorowany tak jak z prezentacji. Umowa używana dla tysięcy jest powszechna, ale nie ma żadnej reprezentacji podczas analizy. Dlatego nazywa się separator grupujący nie separator tysięcy. Mógłbyś mieć coś takiego jak 5,5.0,0, i będzie on nadal ważny.

Sposób grupowania cyfr może się różnić, czasami jest 3-cyfrowy, czasem 2 lub łączony.

Mówiąc logicznie, jeśli jest to tylko separator używany do uproszczenia czytania przez ludzi. Jego pozycja nie zmienia wartości prezentowanej tam liczby, którą można pominąć.


Analiza klasy java.text.DecimalFormat realizowanego przez Oracle wynika, że ​​grupowanie znaki są ignorowane.

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. 

Więcej wizyty Formatting Numeric Print Output

+1

Stwierdził to w pytaniu, myślę, że chce, aby parsowanie się nie powiodło, jeśli przecinek jest w złe miejsce. – Keppil

+0

Nie chce tego, chce wiedzieć, co nie spada. Dodałem komentarz do tego. –

+0

, jak powiedział Keppil, chciałem, aby to się nie udało, jeśli grupa jest niepoprawna (w zależności od ustawień regionalnych) - jeśli jest to możliwe w ogóle – Yoni

-1

As przecinek jest separatorem tysięcy w nas lokalizacji, to jest ignorowany, gdy jest niewłaściwie umieszczony. Wszystkie te ouputs będą drukować 5500.

+1

Mówi o tym w pytaniu, myślę, że chce, aby parsowanie zakończyło się niepowodzeniem, jeśli przecinek znajduje się w niewłaściwym miejscu. – Keppil

0

Jak wspomina javadev, metoda parsowania po prostu ignoruje tysiące separatorów. Sądzę, że musiałbyś zaimplementować metodę parsowania samodzielnie (używając informacji z NumberFormat/DecimalFormat), jeśli chcesz przeprowadzić ścisłe przetwarzanie.

Powiązane problemy