使用的DecimalFormat使用這種號碼的時候沒有給出分析異常:DecimalFormat的轉換數字與非數字
123hello
這顯然不是一個真正的號碼,並轉換爲123.0值。我怎樣才能避免這種行爲?
作爲一個便箋hello123確實給出了一個例外,這是正確的。
感謝, 馬塞爾
使用的DecimalFormat使用這種號碼的時候沒有給出分析異常:DecimalFormat的轉換數字與非數字
123hello
這顯然不是一個真正的號碼,並轉換爲123.0值。我怎樣才能避免這種行爲?
作爲一個便箋hello123確實給出了一個例外,這是正確的。
感謝, 馬塞爾
要做到準確的分析,您可以使用
public Number parse(String text,
ParsePosition pos)
POS初始化爲0,其完成時,它會給你已使用的最後一個字符之後的索引。
然後,您可以將其與字符串長度進行比較,以確保解析是準確的。
只有可憐的API不允許做這樣的事情:decimalFormat.setStrict(true)(嚴格的意思是不允許123hello作爲數字)。關鍵是你不能總是控制電話來解析你自己。其他庫可能使用格式對象。非常感謝您的回覆! – marcel
你可以驗證它是數字使用正則表達式:
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));
}
您的代碼不帶Double.parseDouble(「123hello」)以外的任何內容。 DecimalFormat的要點是解析國際化的數字。 123 456,78是法語區域設置中的有效小數。 –
@JB:的確,我想快點:D –
感謝您的回覆! – marcel
擴大對@ 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;
}
感謝您的回覆! – marcel
看這個http://stackoverflow.com/questions/4324997/why-does-decimalformat-allow-characters-as-suffix –