当前位置: 首页 > 知识库问答 >
问题:

将EditText格式化为带整数的货币

宗政海
2023-03-14

所有-我有一个TextWatcher,它将EditText格式化为货币格式:

private String current = "";
public void onTextChanged(CharSequence s, int start, int before, int count) {
    if(!s.toString().equals(current)){
        editText$.removeTextChangedListener(this);

       String cleanString = s.toString().replaceAll("[$,.]", "");

       double parsed = Double.parseDouble(cleanString);           
       String formated = NumberFormat.getCurrencyInstance().format((parsed/100));          

       current = formated;
       editText$.setText(formated);
       editText$.setSelection(formated.length());

       editText$.addTextChangedListener(this);
    }
}

这很好,问题是我的编辑文本只需要整数,所以我不允许用户输入美分。因此,我想要1比12比123比1234,而不是0.01比0.12比1.23比12.34。如何去掉小数点,但保留逗号?非常感谢。

共有3个答案

莫英卓
2023-03-14

为什么不用currencyFormat格式化金额,然后取出。字符串中的00。

private static final ThreadLocal<NumberFormat> currencyFormat = new ThreadLocal<NumberFormat>() {
        @Override
        protected NumberFormat initialValue() {
            return NumberFormat.getCurrencyInstance();
        }
    };

currencyFormat。get()。格式(

倪德业
2023-03-14

Hexar的答案很有用,但当用户删除所有数字或移动光标时,它缺乏错误检测。我在他的答案和这里的答案的基础上形成了一个完整的解决方案。由于在onTextChanged()方法中设置EditText,这可能不是最佳实践,但它有效。

    /* don't allow user to move cursor while entering price */
    mEditText.setMovementMethod(null);
    mEditText.addTextChangedListener(new TextWatcher() {
        private String current = "";
        NumberFormat formatter = NumberFormat.getCurrencyInstance();
        private double parsed;

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (!s.toString().equals(current)) {
                /* remove listener to prevent stack overflow from infinite loop */
                mEditText.removeTextChangedListener(this);
                String cleanString = s.toString().replaceAll("[$,]", "");

                try {
                    parsed = Double.parseDouble(cleanString);
                }
                catch(java.lang.NumberFormatException e) {
                    parsed = 0;
                }

                formatter.setMaximumFractionDigits(0);
                String formatted = formatter.format(parsed);

                current = formatted;
                mEditText.setText(formatted);

                /* add listener back */
                mEditText.addTextChangedListener(this);
                /* print a toast when limit is reached... see xml below. 
                 * this is for 6 chars */
                if (start == 7) {
                    Toast toast = Toast.makeText(getApplicationContext(), 
                        "Maximum Limit Reached", Toast.LENGTH_LONG);
                    toast.setGravity(Gravity.CENTER, 0, 0);
                    toast.show();
                }
            }
        }

确保用户不会输入无效信息的一种快速方法是编辑xml。对于我的程序,设置了6个数字字符的限制。

        <!-- it says maxLength 8 but it's really 6 digits and a '$' and a ',' -->
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:inputType="number|textVisiblePassword"
            android:maxLength="8"
            android:digits="0123456789"
            android:id="@+id/mEditText"
            android:hint="Price"/>
单于旭东
2023-03-14

如果不介意删除句点和尾随零,可以执行以下操作:

    mEditText.addTextChangedListener(new TextWatcher() {
        private String current = "";

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            if (!s.toString().equals(current)) {
                annualIncomeEntry.removeTextChangedListener(this);

                String cleanString = s.toString().replaceAll("[$,]", "");

                if (cleanString.length() > 0) {
                    double parsed = Double.parseDouble(cleanString);
                    NumberFormat formatter = NumberFormat.getCurrencyInstance();
                    formatter.setMaximumFractionDigits(0);
                    current = formatter.format(parsed);
                } else {
                    current = cleanString;
                }


                annualIncomeEntry.setText(current);
                annualIncomeEntry.setSelection(current.length());
                annualIncomeEntry.addTextChangedListener(this);
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        }
    });

这将把数字格式化程序的最大小数位数设置为零,删除所有尾随的零和句点。我还删除了除法100,以便所有输入的数字都是整数。

还要确保EditText的输入类型为“number”,否则如果用户尝试输入非数字字符,该输入类型将崩溃。

 类似资料:
  • 因此,我将以下EditText addTextChangedListener事件处理程序组合在一起,除了需要一些改进外,它运行良好。当我输入时,它会从右到左填充数字。我宁愿它从左到右填充。现在,如果我输入50个it格式为$0.50,当我输入50时,我希望它的格式为$50.00 下面是xml声明和Java代码,请有人告诉我需要做哪些更改才能得到所需的结果。 XML声明 Java代码

  • 问题内容: 我想用JavaScript格式化价格。我想要一个以a 作为参数并返回如下格式的函数: 最好的方法是什么? 问题答案: 好的,根据您的发言,我正在使用此功能: 我乐于接受改进建议(我不愿意仅仅为了做到这一点就不包括YUI :))我已经知道我应该检测到“”。而不只是将其用作小数点分隔符…

  • 在我当前的项目中,我将货币值存储为表示美分数的。但是,当用户在文本字段中输入此值时,他们很可能希望将其输入为十进制值。此外,如果用户不手动输入,我想在前面加上一个美元符号。我如何利用为我完成大部分工作?或者是否有其他解决方案使用预先存在的Swing组件,这样我就不必通过手动编码来重新发明轮子?

  • 我有一个带有一些数值的字符串。 然而,这两者都给出了错误。 实现这种格式的正确途径是什么? 这是jasper report jrxml的一部分,我希望在这里避免报告上出现“null”,从而插入以下代码: 如何解决这一问题? 多谢阅读。

  • 问题内容: 我正在使用我给定的语言环境获取自定义货币格式。但是,这始终包含我不需要的货币符号,我只想要给定语言环境的正确货币数字格式而没有货币符号。 做一个抛出一个异常.. 问题答案: 以下作品。这有点丑陋,但可以履行合同: 您还可以从货币格式中获取模式,删除货币符号,然后从新模式中重构新格式:

  • 问题内容: 我需要从随机整数(0-255)列表中创建一个十六进制数字字符串。每个十六进制数字应由两个字符表示:5-“ 05”,16-“ 10”等。 例: 我设法提出了: 但是,这看起来有点尴尬。有没有更简单的方法? 问题答案: