Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Корректно преобразовать строку в число,


Автор: Real McCoy 22.1.2008, 19:55
Здравствуйте все!

О преобразовании чисел, выраженных в виде строки я тут читал. Сам пробовал два способа:

1. Проверки с помощью исключения:
Код

try
{
    double value = Double.parseDouble("12345.67")
}
catch(NumberFormatException ex)
{
    // не число
}


2. Проверки с помощью регэкспа:
Код

boolean isNumeric = java.util.regex.Pattern.matches("[\\d\\.\\,\\s]*", "12345.67");


Сейчас, столкнулся я со следующей проблемой: на форме есть JSpinner с моделью SpinnerNumberModel, редактирование поля у спиннера разрешено. Необходима валидация введённого пользователем.

Введённое в поле Спиннера получается путём такого страшного выражения:
Код

String text = ((JSpinner.DefaultEditor)spinner.getEditor()).getTextField().getText();


И оказывается, что например в числе 1000, которое после получения выглядит как "1 000" (введено не пользователем, а пролистано спиннером), между 1 и 0 не пробел, а символ с десятичным кодом 160. Если эту строку попытаться проверить любым из двух способов, то оно не распознается как число.

Вопрос: как всё-таки сделать валидацию на то, что в спиннере число?

Автор: powerOn 22.1.2008, 20:45
А почему вы получаете число из вида, а не из модели?

Код

jSpinner1.setModel(new SpinnerNumberModel());
. . .
SpinnerNumberModel model = (SpinnerNumberModel) jSpinner1.getModel();
System.out.println("value = " + model.getNumber());



Автор: Real McCoy 23.1.2008, 12:17
Потому что модель вернёт последнее корректное значение спиннера. А мне надо предупредить пользователя, если он ввёл что-то неправильное, что значение спиннера откачено к предыдущему. Иначе он просто не заметит этого, т.к. на форме довольно много контролов.

Автор: Maksym 23.1.2008, 12:23
Real McCoy
А если удалить из строки все символы с десятичным кодом 160 и применить описанный тобой способ? smile 

Автор: Real McCoy 23.1.2008, 14:25
Maksym, 
В конце концов я так и сделал. Только символ для замены на пустой получаю у эдитора спиннера:
Код

char groupSeparator = ((JSpinner.NumberEditor)spinner.getEditor()).getFormat().getDecimalFormatSymbols().getGroupingSeparator();


Правда выглядит это как workaround.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)