【问题标题】:Get number from several scientific notations从几个科学记数法中获取数字
【发布时间】:2017-08-04 09:34:42
【问题描述】:

我有几个字符串需要使用 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​​ 之外,这工作正常(运行上面的代码将打印“数字:2.0”)

要求:

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

有可能实现吗?

【问题讨论】:

    标签: java double number-formatting


    【解决方案1】:

    案例 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-19
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多