Parsowanie liczb dziesiętnych z pl_PL. Dlaczego nie pojawia się wyjątek?

0

Witam,

mam być może dość banalne pytanie, ale im dłużej czytam wątki na ten temat wiem mniej i mniej. Chciałbym czytać z JTextField liczbę rzeczywistą przy ustawionym locale na pl_PL. W JTextField wpisuję wartość z przecinkiem (np. 1,2). Czytam tę wartość z powrotem do zmiennej dobule i jest ok. Jeżeli wpiszę w JTextField wartość z kropką, to przy Locale pl_PL dostaję po parsowaniu 0. Najwidoczniej parsowanie kończy się na "kropce". Ale czy nie powinienem dostać ParseFormatException w tym momencie? A jeżeli nie, to jak zrobić abym dostał wyjątek?

public class NMMNumberInputVerifier extends InputVerifier {

    Locale locale;
    
    public NMMNumberInputVerifier(Locale _loc) {
        this.locale=_loc;
    }

    @Override
    public boolean verify(JComponent input) {
        JTextField tf = (JTextField) input;
        NumberFormat nf;
        
       
        boolean isNumeric = true;
 	try {
            System.out.println("Locale: "+this.locale.toString());
            Number nv =  nf.getNumberInstance(this.locale).parse(tf.getText());
            double d = nv.doubleValue();
            System.out.println("Wartosć w polu: "+d);
        } catch (NumberFormatException | ParseException e) {
            isNumeric=false;
            JOptionPane.showMessageDialog(null, "Enter numeric value.", "Bad input!", JOptionPane.ERROR_MESSAGE);
        }
        return isNumeric;
    }
}
0

Byc może parsowanie z jednym stopniem pośrednim Number tak ma.
parsowanie jak poniżej daje wyjątek (u mnie na odwrót, ale to bez znaczenia)

public class JavaApplication5 {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        double v = Double.parseDouble("12,345");
        System.out.println(v);
    }
    
}

Exception in thread "main" java.lang.NumberFormatException: For input string: "12,345"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at javaapplication5.JavaApplication5.main(JavaApplication5.java:
...
AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml Java returned: 1
BUILD FAILED (total time: 0 seconds)

W praktyce ja zawsze olewam podobne ustawienia narodowe. Wczoraj zostawiasz pannie przecinek, dziś już jest kropka bo coś wgrała itd...

0

Tak, takie podejście już przerobiłem. Funkcjonowało u mnie przez dłuższy czas, aż do momentu kiedy postanowiłem "umiędzynarodowić" aplikację wykorzystując mechanizmy dostępne w Javie. Ponieważ jest to jedyna aplikacja jaką w życiu napisałem, chciałem dowiedzieć się jak to robią Ci, który piszą takie rzeczy na co dzień.

0

Dokumentacja NumberFormat przestrzega The method may not use the entire text of the given string. Daje też możliwość sprawdzenia, jak daleko parsowanie doszło, a więc czy wyczerpało cały string (parse(source, parsePosition)). Możesz napisać swój własny parser, który to opakuje i rzuci wyjątek.

1 użytkowników online, w tym zalogowanych: 0, gości: 1