2010-02-15 48 views
6

Tôi có đoạn mã sau để phân tích một biến String gọi là str.Hành vi lạ của NumberFormat Java

NumberFormat formatter = NumberFormat.getInstance(); 
Number number = formatter.parse(str); 

Tôi muốn bắt ngoại lệ được ném khi str không phải là số để xác thực. Vấn đề tôi có là nó không phải lúc nào cũng ném ParseException mong đợi. Khi chuỗi str bắt đầu bằng một số nhưng sau đó là các ký tự có vẻ như để có được một ký tự đầu tiên của chuỗi và phân tích cú pháp chúng dưới dạng một số.

Ví dụ:

  • nếu str = "a10", sau đó được ném một ParseException
  • nếu str = "10a" thì không có ngoại lệ ném và số = 10

tôi không thể sử dụng Double.parseDouble (str) vì str có thể có dấu phẩy và các điểm như 1.000,98 và định dạng này không được hiểu theo phương pháp này.

Tại sao điều này lại xảy ra? Tôi có thể xác nhận nó theo bất kỳ cách nào khác không? Cảm ơn

+1

tôi không có nghĩa là hành vi của NumberFormat là sai, nhưng tôi đã hiểu lầm API. Tôi nghĩ rằng vị trí là để chỉ ra cho đến khi nhân vật mà tôi muốn phân tích cú pháp String. Bây giờ tôi hiểu tại sao nó được thiết kế theo cách này. Cảm ơn tất cả các anwers của bạn. – Javi

Trả lời

6

Các hành vi không phải là lạ, dường như được thiết kế

phân tích văn bản từ đầu chuỗi cho trước để sản xuất một số. Phương thức này có thể không sử dụng toàn bộ văn bản của chuỗi đã cho.

Bạn có thể sử dụng phương pháp phân tích vị trí-aware như thế này:

public static double parse(String str) throws ParseException { 
    NumberFormat formatter = NumberFormat.getInstance(); 
    ParsePosition position = new ParsePosition(0); 
    Number number = formatter.parse(str, position); 
    if (position.getIndex() != str.length()) { 
    throw new ParseException("failed to parse entire string: " + str, position.getIndex()); 
    } 
    return number.doubleValue(); 
} 
+0

Hữu ích với tôi: sử dụng 'setParseIntegerOnly (true)' để ném một ngoại lệ nếu bạn tìm thấy một Float khi mong đợi một Integer – xdola

6

Nếu bạn nhìn vào API, nó nói rõ:

phân tích văn bản từ đầu chuỗi cho trước để sản xuất một số. Phương thức không được sử dụng toàn bộ văn bản của chuỗi đã cho.

Nếu bạn muốn xem phân tích cú pháp phân tích đến mức nào, bạn có thể sử dụng other position-aware method. Bằng cách này bạn có thể kiểm tra xem bạn có bất kỳ ký tự theo sau nào không. Bạn cũng có thể kiểm tra toàn bộ chuỗi ký tự chữ và số bằng cách sử dụng ví dụ các ngôn ngữ phổ biến isAlpha.

+0

Xin lỗi sfussenegger, không thấy bài đăng của bạn trước khi tôi cập nhật với phương pháp nhận biết vị trí. –

+0

@disown rất có thể vì bạn đã nhanh hơn tôi;) – sfussenegger