这是我的代码:
private double stripCurrency(String sBudget) {
DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();
symbols.setCurrencySymbol("");
formatter.setDecimalFormatSymbols(symbols);
double d = Double.valueOf(formatter.format(sBudget)); // Line 52 in LogCat
return d;
}
这是 LogCat:
09-16 10:12:07.641: E/AndroidRuntime(1463): at java.text.NumberFormat.format(NumberFormat.java:304)
09-16 10:12:07.641: E/AndroidRuntime(1463): at java.text.DecimalFormat.format(DecimalFormat.java:702)
09-16 10:12:07.641: E/AndroidRuntime(1463): at java.text.Format.format(Format.java:93)
09-16 10:12:07.641: E/AndroidRuntime(1463): at com.---.---.GasUtil.stripCurrency(GasUtil.java:52)
第一次打开应用程序时会发生这种情况。传入的 String 是 SharedPreference
默认值“100”。
我想做的事情:
应该有一个String
存储在SharedPreferences
中,我将其转换为 double 。该应用程序的旧版本允许在字符串中使用货币符号。所以我正在尝试用旧的方式进行 sanitizer 。所以我正在格式化它以去掉旧的货币符号并变成 double 。即使我解决了这个错误,也不确定我的上面的代码是否是最好的方法,或者是否有更好的方法?因此,我需要以一种能够处理正确和错误格式的方式进行清理。
最佳答案
formatter.format(sBudget)
确实接受一个对象,但它检查它是否是任何形式的 Number
否则它会抛出 IllegalArgumentException
。查看源代码DecimalFormat
。
以下是将货币字符串转换回 double 的正确方法。
private static double stripCurrency(String sBudget) {
//to handle strings with no dollar sign.
if(sBudget.trim().charAt(0) != '$') {
sBudget = "$"+sBudget;
}
DecimalFormat formatter = (DecimalFormat) NumberFormat.getCurrencyInstance(Locale.US);
Number parse = null;
try {
parse = formatter.parse(sBudget);
System.out.println(parse);
} catch (ParseException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return parse.doubleValue();
}
这是您所面临的异常根本原因的源代码。当我们调用formatter.format(sBudget)
时,调用最终会在DecimalForamt
中使用以下方法。
public final StringBuffer format(Object number,
StringBuffer toAppendTo,
FieldPosition pos) {
if (number instanceof Long || number instanceof Integer ||
number instanceof Short || number instanceof Byte ||
number instanceof AtomicInteger ||
number instanceof AtomicLong ||
(number instanceof BigInteger &&
((BigInteger)number).bitLength () < 64)) {
return format(((Number)number).longValue(), toAppendTo, pos);
} else if (number instanceof BigDecimal) {
return format((BigDecimal)number, toAppendTo, pos);
} else if (number instanceof BigInteger) {
return format((BigInteger)number, toAppendTo, pos);
} else if (number instanceof Number) {
return format(((Number)number).doubleValue(), toAppendTo, pos);
} else {
throw new IllegalArgumentException("Cannot format given Object as a Number");
}
}
关于java - 将货币转换为 Double 时 String 类错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25874831/