2017-03-14 29 views
1

我有幾個字符串,我需要使用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的解決方案。

有沒有可能做到這一點?

回答

3

情況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