2015-06-11 2 views
8

У меня есть JFormattedTextField с NumberFormat с Locale.US. Таким образом, десятичный разделитель является точкой, а разделителем группировки является запятая.NumberFormat parse недостаточно строгий

Теперь я набираю строку «1,23» в этом текстовом поле и перемещаю фокус на другой компонент. Я бы ожидал, что строка исчезнет (например, когда я набираю «a» вместо «1,23»), потому что это явно не допустимое представление числа при использовании Locale.US. Но вместо этого текст в текстовом поле изменяется на «123».

Это потому, что используемый метод NumberFormat не является строгим при разборе и просто игнорирует запятую.

Вопрос: Как я могу указать NumberFormat для того,

Код проверки:

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

Переместить фокус из текстового поля с кнопкой, и текст изменится на «123».

+1

Это не дубликат. Другой вопрос касался целых, а не парных. Вопрос здесь сводится к чрезмерному методу NumberFormat, который не проверяет, разрешена ли запятая в этой позиции. Похоже, нам нужен подкласс NumberFormat с более строгой проверкой. –

+1

@ RalfH: Вы правы, это не дубликат. Я отредактировал вопрос, чтобы показать базовое использование NumberFormat в JFormattedTextField. –

+1

Как я могу удалить дублируемую метку из этого вопроса? Я хотел бы опубликовать собственное решение. –

ответ

3

Я хотел бы предложить вам использовать регулярное выражение и использовать fucntion матч так:

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

Кроме того, если вы будете использовать Integer.parseInt(String) сгенерирует исключение, если он будет разобран или вы можете использовать Double.parseDouble(value)

0

На самом деле, Number - это просто супер класс для Double, поэтому вы можете использовать Double.parseDouble(...), а затем авто-unboxing должны сделать все остальное.

 Смежные вопросы

  • Нет связанных вопросов^_^