2011-07-06 25 views
12

Sử dụng DecimalFormat không đưa ra ngoại lệ phân tích cú pháp khi sử dụng loại số:DecimalFormat chuyển đổi số với phi chữ số

123hello

mà rõ ràng là không thực sự là một con số, và chuyển đổi với giá trị 123,0. Làm thế nào tôi có thể tránh được loại hành vi này?

Xin lưu ý rằng hello123 có ngoại lệ, điều này đúng.

Cảm ơn, Marcel

+0

Nhìn vào http://stackoverflow.com/questions/4324997/why-does-decimalformat-allow-characters-as-suffix này –

Trả lời

9

Để làm phân tích chính xác, bạn có thể sử dụng

public Number parse(String text, 
       ParsePosition pos) 

pos Initialize để 0 và khi kết thúc của nó sẽ cung cấp cho bạn các chỉ số sau ký tự cuối cùng đã được sử dụng.

Sau đó, bạn có thể so sánh điều này với độ dài chuỗi để đảm bảo phân tích cú pháp chính xác.

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

+1

Chỉ có một pitty rằng API không cho phép làm một cái gì đó như thế này: decimalFormat.setStrict (true) (nghĩa nghiêm ngặt không cho phép 123hello là số). Vấn đề là bạn không thể luôn kiểm soát cuộc gọi để phân tích cú pháp chính mình. Các thư viện khác có thể sử dụng đối tượng định dạng. Rất cám ơn bạn đã trả lời! – marcel

0

Bạn có thể xác minh đó là số sử dụng một RegEx:

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

Mã của bạn không mang bất kỳ thứ gì khác ngoài Double.parseDouble ("123hello"). Và điểm của DecimalFormat là phân tích các số quốc tế. 123 456,78 là số thập phân hợp lệ theo ngôn ngữ Pháp. –

+0

@JB: thực sự, tôi muốn được nhanh chóng: D –

+0

Cảm ơn bạn đã trả lời! – marcel

1

Mở rộng trên @ câu trả lời Kal của, đây là một phương pháp hữu ích mà bạn có thể sử dụng với bất kỳ định dạng để làm "nghiêm ngặt" phân tích cú pháp (sử dụng commons 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

Cảm ơn bạn đã trả lời! – marcel

Các vấn đề liên quan