如何解决计算器应用程序上 DecimalFormat 的错误

How to solve the error for DecimalFormat on a calculator app

我正在制作一个计算器应用程序。

workingsTV是显示计算的地方

resultsTV是显示计算结果的地方

workings 正在使用 rhino 的库做数学运算。

我想在 workingsTVresultsTV 上每三位添加一个逗号。

我试过这样用 resultsTV

 DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US));
                result = Double.parseDouble(df.format(result));

但是然后应用程序关闭时显示result

这是错误信息
原因:java.lang.reflect.InvocationTargetException
原因:java.lang.NumberFormatException:对于输入字符串:“1,235”

这是代码的顶部

public class MainActivity extends AppCompatActivity {

    TextView workingsTV;
    TextView resultsTV;

    String workings = "";
    String CLEAR_INT_TEXT;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initTextView();
    }



    private void initTextView()
    {
        workingsTV = (TextView)findViewById(R.id.workingsTextView);
        resultsTV = (TextView)findViewById(R.id.resultTextView);
    }

    private void setWorkings(String givenValue)
    {
        workings = workings + givenValue;
        workingsTV.setText(workings);

    }


    public void equalsOnClick(View view)
    {
        Double result = null;
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino");

        try {
            result = (Double) engine.eval(workings);
            if (result != null)
            {

                DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US));
                result = Double.parseDouble(df.format(result));


                int intVal = (int) result.doubleValue();
                if (result == intVal)
                {//Check if it's value is equal to its integer part
                    resultsTV.setText(String.valueOf(intVal));
                }
                else
                {
                    resultsTV.setText(String.valueOf(result));
                }
            }
        }

试试这个:

import java.text.NumberFormat;
import java.util.Locale;

Locale locale = new Locale("en", "US");
NumberFormat fmt = NumberFormat.getCurrencyInstance();
System.out.println(fmt.format(1235.00));

我正在使用该函数将双精度转换为格式化字符串

public String formatDouble(double value, int digits) {
    DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
    decimalFormatSymbols.setGroupingSeparator(',');
    decimalFormatSymbols.setDecimalSeparator('.');
    DecimalFormat decimalFormat = new DecimalFormat("###,##0.00", decimalFormatSymbols);
    decimalFormat.setMinimumFractionDigits(digits);
    decimalFormat.setMaximumFractionDigits(digits);
    return decimalFormat.format(value);
}

在您的代码中,此处已有一个结果值 result = (Double) engine.eval(workings);。你为什么要第二次得到它?此外,使用格式化字符串,可能包含非法字符为双(逗号字符)。

去掉那两行

            DecimalFormat df = new DecimalFormat("###,###.####", new DecimalFormatSymbols(Locale.US));
            result = Double.parseDouble(df.format(result));

并在将结果值设置为 TextView 时格式化结果值,例如我的函数:

resultsTV.setText(formatDouble(result, 4));

在 equalsOnClick() 方法结束时,您应该将 resultintVal 设置为 workings 变量,以便为下一步操作做好准备。

workings = String.valueOf(result);