将货币转换为Double时的错误类字符串

时间:2014-09-16 17:18:42

标签: java android string-formatting

这是我的代码:

  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中的货币符号。所以我试图从旧的方式消毒。所以我正在格式化它以去掉旧货币符号并变成双重符号。不确定我的上述代码是否是最好的方法,即使我解决了这个错误,或者有更好的方法?因此,我需要以一种处理正确和错误格式化的方式进行清理。

1 个答案:

答案 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");
        }
    }