如何解决计算器应用程序上 DecimalFormat 的错误
How to solve the error for DecimalFormat on a calculator app
我正在制作一个计算器应用程序。
workingsTV
是显示计算的地方
resultsTV
是显示计算结果的地方
workings
正在使用 rhino 的库做数学运算。
我想在 workingsTV
和 resultsTV
上每三位添加一个逗号。
我试过这样用 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() 方法结束时,您应该将 result
或 intVal
设置为 workings
变量,以便为下一步操作做好准备。
workings = String.valueOf(result);
我正在制作一个计算器应用程序。
workingsTV
是显示计算的地方
resultsTV
是显示计算结果的地方
workings
正在使用 rhino 的库做数学运算。
我想在 workingsTV
和 resultsTV
上每三位添加一个逗号。
我试过这样用 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() 方法结束时,您应该将 result
或 intVal
设置为 workings
变量,以便为下一步操作做好准备。
workings = String.valueOf(result);