2014-10-08 2 views
0

У меня есть ошибка или что-то в этом роде. У меня есть метод, который сохраняет статью, как это:Парсе двойной от JFormattedTextField

class SaveArticleListener implements ActionListener { 
    //.... 
    String s = textArticlePrice.getText().replace(',','.').replaceAll("\\s",""); 
    double price = Double.parseDouble(s); 
    //.... 
} 

Где textArticlePrice является JFormattedTextField, который настроен как:

NumberFormat priceFormat = NumberFormat.getNumberInstance(); 
priceFormat.setMaximumFractionDigits(2); 
priceFormat.setMinimumFractionDigits(2); 
textArticlePrice = new JFormattedTextField(priceFormat); 
textArticlePrice.setColumns(10); 

И в методе parseDouble я получаю каждый раз:

java.lang.NumberFormatException: For input string: "123 456 789.00" 

So replace работает с точкой, но не с пробелами ... Почему?

+0

Можете ли вы показать нам свой 'parseDouble'? –

+0

Кроме того, что возвращает 'textArticlePrice.getText()' в свой ActionListener? –

+0

@tieTYT ой, извините. это статический импорт из Double class – marknorkin

ответ

1

Вам будет полезно использовать ваш NumberFormat, чтобы разобрать String. Держите ссылку на priceFormat, а затем использовать

double price = priceFormat.parse(textArticlePrice.getText()).doubleValue(); 

форматер, который используется для отображения номера такого же один, то используется, чтобы превратить его обратно в double, так что вы знаете, что это будет разбор его в совместимом путь.

Лучше всего

double price = ((Number) textArticlePrice.getValue()).doubleValue(); 

который должен работать без необходимости преобразования, если вы установите JFormattedTextField правильно. (Вызов getValue() возвращает Object, поэтому вам нужно отдать его. Он может вернуть Double или Long, в зависимости от того, что находится в текстовом поле, поэтому из него можно безопасно получить double, чтобы обработать его как Number , который является супертипом как и вызвать его метод .doubleValue().)

Дать то, что превращает его в нечто, что может быть разобрано Double.parseDouble() действительно не правильный путь, потому что это слишком хрупкими, если форматирование текста полевые изменения позже.

+0

спасибо, это работает. Хорошее решение, но есть ли ошибки в моем коде? – marknorkin

+0

@Mark Если вы имеете в виду другой бит вашего кода, который устанавливает 'JFormattedTextField', это выглядит хорошо для меня! –

+0

'(Double) textArticlePrice.getValue()' не работает для ситуации, когда пользователь вводит число без фракции (что странно, потому что в добавлении форматирования пользовательского интерфейса добавляется «, 00»), тогда я получаю «ClassCastException», потому что фактический тип Долго, поэтому мне нужно вызвать parseDouble. – marknorkin

0

Что касается вашего вопроса «почему он не работает с пробелами». Белые пространства - это символы, такие как a, l, #,?, ¡, Но он только распознает 12345, числа вместе как число, вы не можете сделать int variable 'int number = 1 234; То же самое с разбором. Скорее попробуйте,

s = s.replace(',','.'); 
s = s.replace(" ",""); 
Price = Double.parseDouble(s); 

Предполагая, что «123 456 789,00» - это один номер.

прокомментировать если это помогло.

+0

спасибо за ответ. Я пробовал этот путь, прежде чем заменять его регулярным выражением (\\ s), и похоже, что он не работает либо с – marknorkin

+0

regex? И я теперь просто закодировал его. Пример 123 456 789,00 выглядел странно, потому что число слишком велико. –

0

Я сделал это сейчас, он работал отлично

String strNumber = "1 2 3 4 5 6.789"; 
double DblNumber = Double.parseDouble(strNumber); 
System.out.Println(DblNumber);// this displays the number if your IDE has an output window