Ввод валюты без поля редактирования символа

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

public void onTextChanged(CharSequence s, int start,

        int before, int count) {
    if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
    {
        String userInput= ""+s.toString().replaceAll("[^\\d]", "");
        StringBuilder cashAmountBuilder = new StringBuilder(userInput);

        while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
            cashAmountBuilder.deleteCharAt(0);
        }
        while (cashAmountBuilder.length() < 3) {
            cashAmountBuilder.insert(0, '0');
        }
        cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
        cashAmountBuilder.insert(0, '$');

        cashAmountEdit.setText(cashAmountBuilder.toString());
    }

}

Ввод денег Android с фиксированным десятичным числом

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

Редактировать: После дополнительных комментариев мне стало ясно, что это может быть не этот конкретный фрагмент моего кода. Я могу заставить это работать, используя очень глупую тренировку, изменив знак доллара на пробел в регулярном выражении и введя пробел перед числами, обрезав его позже, когда мне нужно значение, но я не могу найти лучшего работать вокруг.

private TextWatcher billWatcher = new TextWatcher() {
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
    }

public void onTextChanged(CharSequence s, int start, int before, int count) {
        if(!s.toString().matches("^\\$(\\d{1,3}(\\,\\d{3})*|(\\d+))(\\.\\d{2})?$"))
        {
            String userInput= ""+s.toString().replaceAll("[^\\d]", "");
            StringBuilder cashAmountBuilder = new StringBuilder(userInput);

            while (cashAmountBuilder.length() > 3 && cashAmountBuilder.charAt(0) == '0') {
                cashAmountBuilder.deleteCharAt(0);
            }
            while (cashAmountBuilder.length() < 3) {
                cashAmountBuilder.insert(0, '0');
            }
            cashAmountBuilder.insert(cashAmountBuilder.length()-2, '.');
            cashAmountBuilder.insert(0, '$');     

            billBox.setText(cashAmountBuilder.toString());
            billBox.setTextKeepState(cashAmountBuilder.toString());
            Selection.setSelection(billBox.getText(), cashAmountBuilder.toString().length());
        }
    }

XML для коробки

 <EditText
        android:id="@+id/billBox"
        android:layout_width="152dp"
        android:layout_height="40dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/billText"
        android:layout_marginRight="5dp"
        android:layout_marginTop="5dp"
        android:digits="0123456789."
        android:gravity="right"
        android:inputType="numberDecimal" />

person W0lf7    schedule 20.02.2012    source источник


Ответы (4)


У вас есть: <EditText ... android:digits="0123456789." ... />

и все же ваше регулярное выражение имеет \\$(\\d{1,3}.... Что переводится как «Знак доллара, за которым следуют другие цифры».

Я думаю, что система сбита с толку тем, что вы требуете присутствия знака доллара, но запрещаете его в своем XML.

Я бы убрал первую часть вашего регулярного выражения и поставил знак доллара для пользователя.

person gobernador    schedule 20.02.2012
comment
Я отметил это как правильное, потому что вы подсказали мне решить проблему, я забыл удалить \\, а также знак доллара в начале регулярного выражения, теперь проблема исправлена. Спасибо! - person W0lf7; 20.02.2012

Удалить эту строку

cashAmountBuilder.insert(0, '$');
person Dave    schedule 20.02.2012
comment
Мое приложение вылетает, я вставлю больше кода из класса, на который влияет это поле. - person W0lf7; 20.02.2012

Все, что вам нужно сделать, чтобы убрать символ доллара, это убрать эту строку: cashAmountBuilder.insert(0, '$');.

person jersam515    schedule 20.02.2012
comment
Добавил свою рабочую версию кода со знаком доллара. Удаление указанного метода полностью приводит к сбою приложения при запуске. - person W0lf7; 20.02.2012

Я думаю, вы пытаетесь сделать слишком много из того, что система уже может сделать за вас. Если вы сохраняете значение валюты как двойное внутри и форматируете его только тогда, когда хотите его отобразить, это намного проще. Смотрите мое решение по этой ссылке. Это может помочь. ответ на вопрос о редактировании валюты

person Digilee    schedule 08.04.2012