NumberFormat parameter is not strict enough

I have a JFormattedTextField with NumberFormat with Locale.US. Thus, the decimal separator is a period, and the grouping separator is a comma.

Now I type the string "1.23" in this text box and move the focus to another component. I would expect the string to disappear (for example, when I type "a" instead of "1.23"), because this is clearly not a valid representation of the number when using Locale.US. But instead, the text in the text box changes to "123".

This is because the NumberFormat used is not strict on parsing and just ignores the comma.

Question How can I tell NumberFormat to throw a ParseException in this case, so that the text field is empty after focus is moved to another component?

Test code:

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); 

Move the focus from the text box to the button, and the text will change to "123".

+8
java swing number-formatting jformattedtextfield
source share
2 answers

I suggest you use a regex and use the match function as follows:

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

Also, if you use Integer.parseInt(String) , an exception will be thrown if it is parsed or you can use Double.parseDouble(value)

+3
source share

In fact, Number is just a superclass for Double , so you can use Double.parseDouble(...) and then auto-unboxing should do the rest.

0
source share

All Articles