这是我的代码:
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
,我将其转换为双倍。旧版本的应用程序允许String中的货币符号。所以我试图从旧的方式消毒。所以我正在格式化它以去掉旧货币符号并变成双重符号。不确定我的上述代码是否是最好的方法,即使我解决了这个错误,或者有更好的方法?因此,我需要以一种处理正确和错误格式化的方式进行清理。
答案 0 :(得分:3)
formatter.format(sBudget)
会接受一个Object,但会检查它是否为Number
的任何形式,否则会引发IllegalArgumentException
。查看源代码DecimalFormat
。
以下是将货币字符串转换回双倍的更正方法。
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");
}
}