从几个科学计数法中获取数字

Get number from several scientific notations

我有几个字符串需要使用 NumberFormat 获得 Double。 字符串可以有多种格式,如下所示:

"0"           // case 1
"0.00003"     // case 2
"5e-76"       // case 3
"2E-10"       // case 4

我使用以下代码获取双精度值:

    NumberFormat numberFormat = NumberFormat.getInstance(Locale.US);
    String val = "2e-7";
    try {
        Number number = numberFormat.parse(val);
        System.out.println("number: " + number.doubleValue());
    } catch (ParseException ex) {
        System.out.println("error: " + ex);
    }

除了第 3 种情况(运行 上面的代码将打印 "number: 2.0")

要求:

我知道 Double.valueOf(val) 在这里可以正常工作,但我正在寻找仅使用 NumberFormat 的解决方案。

有可能实现吗?

案例 3 失败,因为 "e" 是小写。我们可以创建 NumberFormat 的子类,在解析之前将字符串大写。

public final class CaseInsensitiveNumberFormat extends NumberFormat {
    private final NumberFormat mParent;
    private final Locale mLocale;

    public CaseInsensitiveNumberFormat(Locale locale) {
        mParent = NumberFormat.getInstance(locale);
        mLocale = locale;
    }

    @Override
    public final Number parse(String s, ParsePosition pos) {
        return mParent.parse(s.toUpperCase(mLocale), pos);   // <------
    }

    @Override
    public final StringBuffer format(double number, StringBuffer appendTo, FieldPosition pos) {
        return mParent.format(number, appendTo, pos);
    }

    @Override
    public final StringBuffer format(long number, StringBuffer appendTo, FieldPosition pos) {
        return mParent.format(number, appendTo, pos);
    }
}
NumberFormat fmt = new CaseInsensitiveNumberFormat(Locale.US);

System.out.println(fmt.parse("0"));       // 0
System.out.println(fmt.parse("0.00003")); // 3.0E-5
System.out.println(fmt.parse("5e-76"));   // 5.0E-76
System.out.println(fmt.parse("2E-10"));   // 2.0E-10