java - 将货币转换为 Double 时 String 类错误

标签 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中,我将其转换为 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/

相关文章:

java - 在Java中访问声卡或操作系统合成器设备

android - 发布有排行榜但没有成就的 Android 应用程序

java - Pdf(带有 type 3 字体)到 Java 中的图像转换

java - 采用另一个进程的子窗口

java - 将数组作为参数传递 - 棋盘

android - 如何在Flutter WebView或InAppWebView中添加JavaScriptInterface?

android - 好设计 : Worker Threads and Activity Restarts

c# - 在 .NET 中将小时数转换为分钟数

python - 使用 Python 的 str.format() 方法使用十六进制、八进制或二进制整数作为参数索引时出现 KeyError

c# - Double.ToString 用于格式化