2015-06-11 11 views
8

Ho un JFormattedTextField con un NumberFormat con Locale.US. Quindi il separatore decimale è il punto e il separatore di raggruppamento è la virgola.NumberFormat non sufficientemente accurato

Ora digito la stringa "1,23" in questo campo di testo e sposta lo stato attivo su un altro componente. Mi aspetto che la stringa scompaia (come quando digito "a" anziché "1,23") perché ovviamente non è una rappresentazione valida di un numero quando si utilizza Locale.US. Ma invece il testo nel campo di testo è cambiato in "123".

Questo perché il NumberFormat utilizzato non è rigido durante l'analisi e semplicemente ignora la virgola.

Domanda: Come posso dire a NumberFormat di lanciare una ParseException in questo caso in modo che il campo di testo sia vuoto dopo aver spostato lo stato attivo su un altro componente?

Codice di prova:

JDialog dialog = new JDialog(); 
    JPanel panel = new JPanel(new BorderLayout()); 
    dialog.getContentPane().add(panel); 

    NumberFormat nf = NumberFormat.getInstance(Locale.US); 
    JFormattedTextField textField = new JFormattedTextField(nf); 
    textField.setText("1,23"); 
    panel.add(textField, BorderLayout.CENTER); 
    panel.add(new JButton("focus"), BorderLayout.EAST); 

    dialog.pack(); 
    dialog.setVisible(true); 

Spostare l'attenzione dal campo di testo per il pulsante e il testo cambierà in "123".

+1

Questo non è un duplicato. L'altra domanda riguardava Interiers, non Doubles. La domanda qui si riduce a un NumberFormat eccessivamente indulgente che non controlla se è consentita una virgola in quella posizione. Sembra che abbiamo bisogno di una sottoclasse di NumberFormat con un controllo più severo. –

+1

@RalfH: hai ragione, questo non è un duplicato. Ho modificato la domanda per mostrare l'uso sottostante di NumberFormat in JFormattedTextField. –

+1

Come posso rimuovere l'etichetta duplicata da questa domanda? Vorrei pubblicare la mia soluzione. –

risposta

3

vorrei suggerire di utilizzare regex e utilizzare il match fucntion come questo:

matches("\\d+([.,])?") 

anche se si utilizzerà Integer.parseInt(String) sarà un'eccezione se sarà analizzato oppure è possibile utilizzare Double.parseDouble(value)

0

In realtà, Number è solo una super classe per Double, quindi è possibile utilizzare Double.parseDouble(...) e l'auto-unboxing dovrebbe fare il resto.

Problemi correlati