android 如何同时拥有edittext自动格式本身和可计算的值

标签 android

我有 2 个编辑文本和 1 个 TextView 。 1 个用于输入价格的编辑文本,另一个用于输入百分比, TextView 将显示它们的结果 (价格 * 百分比/100) 并且我想进行第一个编辑文本输入(对于价格)更改输入的格式并将其以十进制格式显示在相同的编辑文本上。例如:

edittext1
100

用户输入 100 时,它只会显示 100,但是当用户输入一个或多个数字时,它会每 3 个数字添加“,”

edittext1
1,000 
edittext1
10,000 
edittext1
100,000
edittext1
1,000,000
and so on

我有这些功能,一个会自动计算 textview1 的值,另一个会自动转换 edittext 的输入。然而,它们不能一起工作,因为计算函数的格式使用 int/long/double ,而转换器使用decimalformat 。如果我使用它们,应用程序将崩溃,javanumberformatexception无法解析int“1,000”(如果我们将1000放入edittext)

我的自动计算函数

public void onCreate(Bundle savedInstanceState) {       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.simulasikredit);

        ethint1 = (EditText) findViewById(R.id.ethint);
        etpersen2 = (EditText) findViewById(R.id.etpersen);     
        textvDP1 = (TextView) findViewById(R.id.textvDP);   
etpersen2.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                String text1 = ethint1.getText().toString();
                String text2 = etpersen2.getText().toString();
                long input1 = 0;
                long input2 = 0;
                if(text1.length()>0)
                      input1 = Long.valueOf(text1);
                if(text2.length()>0)
                      input2 = Long.valueOf(text2);                
                if (text1.length() != 0) {    
                    long output = (input1 * input2) / 100;
                    textvDP1.setText(""+output);                                     
                }
                else if(text2.length() == 0){                   
                    textvDP1.setText("");
                }
            }
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            }
            @Override
            public void afterTextChanged(Editable s) {
            }
        }); }

et代表edittext,tv代表textview

和makedecimal函数

public void makedecimal(View v)
                {
                                ethint1.setRawInputType(InputType.TYPE_CLASS_NUMBER | InputType.TYPE_NUMBER_FLAG_DECIMAL);

                                DigitsKeyListener dkl = new DigitsKeyListener(true,true);
                                ethint1.setKeyListener(dkl);

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

                        @Override
                        public void afterTextChanged(Editable s) {
                                String userInput=s.toString();

                                if(!userInput.toString().equals(current)){
                                                ethint1.removeTextChangedListener(this);

                                                String cleanString = userInput.replaceAll("[,]", "");

                                                if(cleanString.length()>0){
                                                                double parsed = Double.parseDouble(cleanString);                                                
                                                                String formated = DecimalFormat.getNumberInstance().format(parsed);

                                                                current = formated;
                                                                ethint1.setText(formated);
                                                                ethint1.setSelection(formated.length());
                                                }else{
                                                                ethint1.setText(cleanString);
                                                                ethint1.setSelection(cleanString.length());
                                                }

                                                ethint1.addTextChangedListener(this);
                    }

这个makedecimal是来自ethint的android:onClick,ethint是id(这两个来自1个edittext)

最佳答案

在我们需要格式化以千为单位的数字并支持分数之前,我需要满足类似的要求。

我的方法是每次输入更改时注册一个 TextWatcher 格式的文本,并提供一个公共(public)方法通过剥离分隔符来获取数值,这是相当棘手的。我的解决方案还通过利用 DecimalFormatSymbols 来满足特定于区域设置的分隔符。类。

private final char GROUPING_SEPARATOR = DecimalFormatSymbols.getInstance().getGroupingSeparator();
private final char DECIMAL_SEPARATOR = DecimalFormatSymbols.getInstance().getDecimalSeparator();

...

/**
 * Return numeric value repesented by the text field
 * @return  numeric value or {@link Double.NaN} if not a number
 */
public double getNumericValue() {
    String original = getText().toString().replaceAll(mNumberFilterRegex, "");
    if (hasCustomDecimalSeparator) {
    // swap custom decimal separator with locale one to allow parsing
        original = StringUtils.replace(original,
                String.valueOf(mDecimalSeparator), String.valueOf(DECIMAL_SEPARATOR));
    }

    try {
        return NumberFormat.getInstance().parse(original).doubleValue();
    } catch (ParseException e) {
        return Double.NaN;
    }
}

/**
 * Add grouping separators to string
 * @param original  original string, may already contains incorrect grouping separators
 * @return  string with correct grouping separators
 */
private String format(final String original) {
    final String[] parts = original.split("\\" + mDecimalSeparator, -1);
    String number = parts[0] // since we split with limit -1 there will always be at least 1 part
            .replaceAll(mNumberFilterRegex, "")
            .replaceFirst(LEADING_ZERO_FILTER_REGEX, "");

    // only add grouping separators for non custom decimal separator
    if (!hasCustomDecimalSeparator) {
        // add grouping separators, need to reverse back and forth since Java regex does not support
        // right to left matching
        number = StringUtils.reverse(
                StringUtils.reverse(number).replaceAll("(.{3})", "$1" + GROUPING_SEPARATOR));
        // remove leading grouping separator if any
        number = StringUtils.removeStart(number, String.valueOf(GROUPING_SEPARATOR));
    }

    // add fraction part if any
    if (parts.length > 1) {
        number += mDecimalSeparator + parts[1];
    }

    return number;
}

这里详细说明是相当乏味的,所以我只提供一个链接供您自己阅读: https://gist.github.com/hidroh/77ca470bbb8b5b556901

关于android 如何同时拥有edittext自动格式本身和可计算的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28761820/

相关文章:

android - 如何在不使用新图像的情况下减小Android单选按钮上显示的图像大小

java - 导出和导入 SQLite 数据库

android - 向用户显示 UI 时的事件?

带有布局的 Android 轮播效果

android - Firebase Android - "Found a conflicting setters with name: setGregorianChange"当 .setValue() 崩溃

android - 如何在触摸 View 时暂停和恢复 kotlin 协程?

android - Web Speech api 不适用于 android chrome

Android ImageView内存管理

java - Android:固定位置工具栏

android - 如何检测从最近列表中删除的应用程序?