Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подойдет ли NumberFormatter? Как отобразить цену? 
:(
    Опции темы
azz
  Дата 4.4.2006, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 12.9.2005
Где: Munchen (Deutschl and)

Репутация: нет
Всего: нет



Мне надо сделать текстовое поле которое отображало duble. (а именно цену). Выглядеть это должно примерно так: 12.345,20. Причем если знаков после запятой нет или толко один - должны дововлятся...
Это можно сделать с FormatedTextField или надо писать свой класс?

Дополнительные вопросы:
1. Как из этого поля получить duble?
2. Какой самый простой способ выделить весь текст в поле?
PM MAIL   Вверх
Beard
Дата 4.4.2006, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 9



Можно:
Код

        MaskFormatter mf = new MaskFormatter("##.###,##"); 
        mf.setPlaceholderCharacter('0');        
        final JFormattedTextField field = new JFormattedTextField(mf);
        JFrame frame = new JFrame();
        JButton button = new JButton("PushMe");
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String number = field.getText();
                double d = Integer.parseInt(number.substring(0, 2)) * 1000 + Integer.parseInt(number.substring(3, 6)) + Double.parseDouble(number.substring(7))/100;
                System.err.println(d);
            }
        });

Наверно, преобразовывать к double надо иначе - воспользоваться каким-нить форматтером или еще что-нить в таком духе

А что значит - выделить (второй пункт)?

PM MAIL   Вверх
LSD
Дата 4.4.2006, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(Beard @ 4.4.2006, 20:15 Найти цитируемый пост)
Наверно, преобразовывать к double надо иначе - воспользоваться каким-нить форматтером или еще что-нить в таком духе

Например так:
Код
DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setDecimalSeparator(',');
symbols.setGroupingSeparator('.');
DecimalFormat format = new DecimalFormat("##,###.##", symbols);
System.out.println(format.parse("12.345,20").doubleValue());



Цитата(azz @ 4.4.2006, 19:19 Найти цитируемый пост)
2. Какой самый простой способ выделить весь текст в поле?

Код
textField.setSelectionStart(0);
textField.setSelectionEnd(textField.getDocument().getLength());



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Beard
Дата 4.4.2006, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 9



Проще использовать selectAll()
Код

                textField.selectAll();
                textField.getCaret().setSelectionVisible(true);

PM MAIL   Вверх
azz
Дата 4.4.2006, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 12.9.2005
Где: Munchen (Deutschl and)

Репутация: нет
Всего: нет



Просто не может не радовать тот факт, насколько всеже мир не без добрых людей... Щас начну пробовать и то что получится потом вылвжу сдесь. Всем спасиба!
PM MAIL   Вверх
azz
Дата 5.4.2006, 06:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 12.9.2005
Где: Munchen (Deutschl and)

Репутация: нет
Всего: нет



А как сделать чтоб 2 знака после запятой добовлялись если они не заданны?
PM MAIL   Вверх
LSD
Дата 5.4.2006, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 38
Всего: 538



Цитата(azz @ 5.4.2006, 07:33 Найти цитируемый пост)
А как сделать чтоб 2 знака после запятой добовлялись если они не заданны?

Так они и будут добавляться. Вначале у тебя JFormattedTextField заполнено нулями. И если пользователь не вобъет свое значение, то там нули и останутся.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
azz
Дата 5.4.2006, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 12.9.2005
Где: Munchen (Deutschl and)

Репутация: нет
Всего: нет



Я пока сто так сделал:
Код

public class MoneyTextField extends JFormattedTextField {
    private DecimalFormat format;
    public MoneyTextField(){

        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        format = new DecimalFormat("##,###.##", symbols);
        format.setMinimumFractionDigits(2);
                                        setFormatter(format);
        addFocusListener(new FocusAdapter()
            {
                public void focusGained(FocusEvent e) {
                    selectAll();
                    
                }

            });
    }

}

но он не принемает setFormatter(format); Почему?? И что делать?
PM MAIL   Вверх
Beard
Дата 5.4.2006, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.7.2005
Где: Санкт-Петербург

Репутация: нет
Всего: 9



Потому что - разве в JavaDoc ничего не написано?
DecimalFormat предназначен для форматирования decimal numbers, его ты будешь
использовать для получения из строки (что вернет JTextFormatted) double
а JFormattedField::setFormatter() использует JFormattedField.AbstractFormatter для
форматирования своего текста, поэтому надо использовать его реализацию, например
MaskFormatter из моего примера.
Что-нить в таком духе:
Код

public class MoneyTextField extends JFormattedTextField {
    private DecimalFormat format;

    public MoneyTextField() {
        super();
        MaskFormatter mf;
        try {
            mf = new MaskFormatter("##.###,##");
            mf.setPlaceholderCharacter('0');
            setFormatterFactory(new DefaultFormatterFactory(mf));
        } catch (ParseException e1) {
            // never happen
        }
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        format = new DecimalFormat("##,###.##", symbols);
        format.setMinimumFractionDigits(2);

        addFocusListener(new FocusAdapter() {
            public void focusGained(FocusEvent e) {
                selectAll();
            }
        });
    }
....
    public double getDouble() {
        double result = 0.0;
        try {
            result = format.parse(getText()).doubleValue();
        } catch (ParseException e) {
            // never happen
        }
        return result;
    }
}


Это сообщение отредактировал(а) Beard - 5.4.2006, 13:42
PM MAIL   Вверх
azz
Дата 5.4.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 12.9.2005
Где: Munchen (Deutschl and)

Репутация: нет
Всего: нет



Все... Вроде закончил . Выношу на ваш суд, оптимезацию... а может кому и пригадится:
1. Класс который мне форматированные поля генерирует:
Код

public class FormatTextFactory {
    
    public final static String datePattern = "d.MM.yyyy";
    public final static String monatPattern = "MM.yyyy";
    public static DecimalFormatSymbols symbols;
    private static FormatTextFactory instance = null;
    private static DecimalFormat moneyFormat;
    
    public final static DateFormat dateFormatter = new SimpleDateFormat(datePattern);
    public final static DateFormat monatFormatter = new SimpleDateFormat(monatPattern);
    
    private FormatTextFactory(){
        symbols = new DecimalFormatSymbols();
        symbols.setDecimalSeparator(',');
        symbols.setGroupingSeparator('.');
        moneyFormat = new DecimalFormat("##,###.##", symbols);
        moneyFormat.setMinimumFractionDigits(2);
        
    }
    
    public static JFormattedTextField getNewDataField(){
        JFormattedTextField result = new JFormattedTextField(dateFormatter);
        return result;
        
    }
    
    public static JFormattedTextField getNewMonatsField(){
        JFormattedTextField result = new JFormattedTextField(monatFormatter);
        return result;
        
    }
    
    public static JFormattedTextField getMoneyField(){
        if(instance == null){
            instance = new FormatTextFactory();
        }
        JFormattedTextField result = new JFormattedTextField(moneyFormat);
        result.addFocusListener(new FocusAdapter()
            {
                public void focusGained(FocusEvent e) {
                    Object obj = e.getSource();
                    ((JFormattedTextField)obj).selectAll();
                    
                }

            });

        return result;
        
        
    }
    
    public static DecimalFormat getMoneyFormat(){
        return moneyFormat;
    }

}


2. Так я загоняю значение в поле:
Код

txtPriceBrutto.setValue(Double.valueOf(car.getPriceBrutto()));

3. А так получаю из него :
Код

car.setPriceBrutto(FormatTextFactory.getMoneyFormat().parse(txtPriceBrutto.getText()).doubleValue());

PM MAIL   Вверх
azz
Дата 5.4.2006, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 12.9.2005
Где: Munchen (Deutschl and)

Репутация: нет
Всего: нет



Нет не все....
Перестал срабатывать getFocus....
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0738 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.