2011-07-06 61 views
12

使用的DecimalFormat使用這種號碼的時候沒有給出分析異常:DecimalFormat的轉換數字與非數字

123hello

這顯然不是一個真正的號碼,並轉換爲123.0值。我怎樣才能避免這種行爲?

作爲一個便箋hello123確實給出了一個例外,這是正確的。

感謝, 馬塞爾

+0

看這個http://stackoverflow.com/questions/4324997/why-does-decimalformat-allow-characters-as-suffix –

回答

9

要做到準確的分析,您可以使用

public Number parse(String text, 
       ParsePosition pos) 

POS初始化爲0,其完成時,它會給你已使用的最後一個字符之後的索引。

然後,您可以將其與字符串長度進行比較,以確保解析是準確的。

http://download.oracle.com/javase/1.4.2/docs/api/java/text/DecimalFormat.html#parse%28java.lang.String,%20java.text.ParsePosition%29

+1

只有可憐的API不允許做這樣的事情:decimalFormat.setStrict(true)(嚴格的意思是不允許123hello作爲數字)。關鍵是你不能總是控制電話來解析你自己。其他庫可能使用格式對象。非常感謝您的回覆! – marcel

0

你可以驗證它是數字使用正則表達式:

String input = "123hello"; 
double d = parseDouble(input); // Runtime Error 

public double parseDouble(String input, DecimalFormat format) throws NumberFormatException 
{ 
    if (input.equals("-") || input.equals("-.")) 
     throw NumberFormatException.forInputString(input); 
    if (!input.matches("\\-?[0-9]*(\\.[0-9]*)?")) 
     throw NumberFormatException.forInputString(input); 

    // From here, we are sure it is numeric. 
    return format.parse(intput, new ParsePosition(0)); 
} 
+2

您的代碼不帶Double.parseDouble(「123hello」)以外的任何內容。 DecimalFormat的要點是解析國際化的數字。 123 456,78是法語區域設置中的有效小數。 –

+0

@JB:的確,我想快點:D –

+0

感謝您的回覆! – marcel

1

擴大對@ Kal的答案,這裏是一個實用的方法,你可以用任何格式用做「嚴」解析(使用Apache公地StringUtils的):

public static Object parseStrict(Format fmt, String value) 
    throws ParseException 
{ 
    ParsePosition pos = new ParsePosition(0); 
    Object result = fmt.parseObject(value, pos); 
    if(pos.getIndex() < value.length()) { 
     // ignore trailing blanks 
     String trailing = value.substring(pos.getIndex()); 
     if(!StringUtils.isBlank(trailing)) { 
      throw new ParseException("Failed parsing '" + value + "' due to extra trailing character(s) '" + 
            trailing + "'", pos.getIndex()); 
     } 
    } 
    return result; 
} 
+0

感謝您的回覆! – marcel