开发者

EditText with Currency format

开发者 https://www.devze.com 2023-04-10 06:30 出处:网络
I have a EditText in which I want to display currency: input.setInputType(InputType.TYPE_CLASS_NUMBER);

I have a EditText in which I want to display currency:

    input.setInputType(InputType.TYPE_CLASS_NUMBER);
    input.addTextChangedListener(new CurrencyTextWatcher());

with:

public class CurrencyTextWatcher implements TextWatcher {

boolean mEditing;

public CurrencyTextWatcher() {
    mEditing = false;
}

public synchronized void afterTextChanged(Editable s) {
    if(!mEditing) 开发者_JAVA百科{
        mEditing = true;

        String digits = s.toString().replaceAll("\\D", "");
        NumberFormat nf = NumberFormat.getCurrencyInstance();

        try{
            String formatted = nf.format(Double.parseDouble(digits)/100);
            s.replace(0, s.length(), formatted);
        } catch (NumberFormatException nfe) {
            s.clear();
        }

        mEditing = false;
    }
}

I want to user to see a number-only keyboard, that is why I call

input.setInputType(InputType.TYPE_CLASS_NUMBER);

on my EditText. However, it does not work. I see the numbers as typed in without any formatting. BUT: If I DO NOT set the inputType via input.setInputType(InputType.TYPE_CLASS_NUMBER), the formatting works perfectly. But the user must use the regular keyboard, which is not nice. How can I use the number keyboard and also see the correct currency formatting in my EditText? Thanks.


It is better to use InputFilter interface. Much easier to handle any kind of inputs by using regex. My solution for currency input format:

public class CurrencyFormatInputFilter implements InputFilter {

Pattern mPattern = Pattern.compile("(0|[1-9]+[0-9]*)?(\\.[0-9]{0,2})?");

@Override
public CharSequence filter(
        CharSequence source,
        int start,
        int end,
        Spanned dest,
        int dstart,
        int dend) {

    String result = 
            dest.subSequence(0, dstart)
            + source.toString() 
            + dest.subSequence(dend, dest.length());

    Matcher matcher = mPattern.matcher(result);

    if (!matcher.matches()) return dest.subSequence(dstart, dend);

    return null;
}
}

Valid: 0.00, 0.0, 10.00, 111.1
Invalid: 0, 0.000, 111, 10, 010.00, 01.0

How to use:

editText.setFilters(new InputFilter[] {new CurrencyFormatInputFilter()});


Try add this property in you xml declaration for you edit text:

android:inputType="numberDecimal" or number or signed number

See more info about android:inputType here.

0

精彩评论

暂无评论...
验证码 换一张
取 消