将EditText限制为只显示两位小数

7

我希望在我的编辑文本中仅显示两位小数,当然我想在编辑文本中显示货币,但将其值限制为小数点后2位。

我看到一些解决方案使用正则表达式,但我不想这样做。我已经被告知Java支持一些内部库函数可以实现此操作。请问是否有人能够给我提示或提供高效的代码。

谢谢

amount.setRawInputType(Configuration.KEYBOARD_12KEY);

         amount.addTextChangedListener(new TextWatcher() 
         {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                // TODO Auto-generated method stub
                DecimalFormat formatVal = new DecimalFormat("##.##");
                String formatted = formatVal.format(s);
                amount.setText(formatted);

            }

你有没有考虑过实现某种2槽选择器呢?这只是一个想法。也许可以提供更友好的用户体验。 - j_mcnally
4个回答

7
你可以简单地使用 DecimalFormat
DecimalFormat format = new DecimalFormat("##.##");
String formatted = format.format(22.123);
editText.setText(formatted);

你将在EditText中得到结果为22.12


请问您能否澄清一下,如何使用它? - Muhammad Umar
好的,我已经将这段代码放在了onTextChanged属性中。它报出了非法参数异常。有什么想法吗? - Muhammad Umar
没有看到代码,我怎么能知道你在哪里出现了异常? - Lalit Poptani

4
这里有一个解决方案,可以在编辑文本时限制用户的操作。
    InputFilter filter = new InputFilter() {
    final int maxDigitsBeforeDecimalPoint=2;
    final int maxDigitsAfterDecimalPoint=2;

    @Override
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {
            StringBuilder builder = new StringBuilder(dest);
            builder.replace(dstart, dend, source
                    .subSequence(start, end).toString());
            if (!builder.toString().matches(
                    "(([1-9]{1})([0-9]{0,"+(maxDigitsBeforeDecimalPoint-1)+"})?)?(\\.[0-9]{0,"+maxDigitsAfterDecimalPoint+"})?"

                    )) {
                if(source.length()==0)
                    return dest.subSequence(dstart, dend);
                return "";
            }

        return null;

    }
};

mEdittext.setFilters(new InputFilter[] { filter });

例如,12.22只允许输入小数点前两位和小数点后两位。

0
你只需要将 setKeyListener() 分配给你的 EditText
myEditText.setKeyListener(DigitsKeyListener.getInstance(true,true));

返回一个 DigitsKeyListener,它接受数字 0 到 9,加上减号(仅在开头)和/或小数点(每个字段只能有一个),如果指定的话。

0

输入:

 mBinding.etPriceUpdate.setText = getString(R.string.txt_rupees) + " " + "%.2f".format(firstNum!!.toDouble() * secondNum.toDouble())

输出:

₹ 4567.54

这将把浮点数1.23456格式化为2位小数,因为我们在格式化指令%.2f中使用了小数点后面的两个数字,f表示浮点数,它包括Java中的double和float数据类型。不要尝试在此处使用“d”来表示double,因为它用于格式化整数并代表格式化指令中的十进制。顺便说一句,在这里有一个陷阱,format()方法也会任意地四舍五入数字。例如,如果您想将1.99999格式化为2位小数,则它将返回2.0而不是1.99,如下所示。


1
请详细说明您的答案。还可以添加更多代码,以指示其在问题代码中的位置。 - cst1992

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接