2011-12-07 20 views
7

Tôi đang xác thực tính năng nhập của người dùng từ biểu mẫu.Làm cách nào để phân tích cú pháp số nghiêm ngặt hơn so với NumberFormat trong Java?

Tôi phân tích cú pháp đầu vào với NumberFormat, nhưng nó là điều ác và cho phép hầu hết mọi thứ. Có cách nào để phân tích cú pháp số nghiêm ngặt hơn không?

Ví dụ: Tôi muốn không cho phép ba đầu vào, cho một số nguyên, nhưng Numberformat cho phép tất cả trong số họ:

NumberFormat nf = NumberFormat.getNumberInstance(); 
nf.setParseIntegerOnly(true); 

Number numberA = nf.parse("99.731"); // 99 (not what the user expect) 
Number numberB = nf.parse("99s.231"); // 99 (invalid) 
Number numberC = nf.parse("9g9");  // 9 (invalid) 

System.out.println(numberA.toString()); 
System.out.println(numberB.toString()); 
System.out.println(numberC.toString()); 
+0

thế nào về chuyển đổi nó thành một chuỗi và sau đó lặp qua chuỗi và chỉ cho phép các ký tự "0" .. "9"?hoặc chỉ cần truy cập getIntegerInstance(); – ComputerSaysNo

+0

@DorinDuminica: 'getIntegerInstance()' cho kết quả tương tự. – Jonas

+1

tại sao không sử dụng 'Integer.parseInt (String)' –

Trả lời

1

Nếu bạn muốn phân tích một số nguyên bao gồm một tùy chọn '-' tiếp theo 1 hoặc nhiều chữ số thập phân, sau đó

int num = Integer.parseInt(str); 

hoặc

long num = Long.parseLong(str); 

Nếu bạn chỉ đơn giản muốn xác nhận và không thực hiện chuyển đổi số nguyên, sau đó một regex là một thay thế khác; ví dụ.

boolean ok = Pattern.compile("-?\\d+").matches(str); 
+0

Hoặc 'str.matches (" -? \\ d + ")' để súc tích hơn. –

3

Có rất nhiều cách để làm điều đó:

0

Sử dụng DecimalFormat với chuỗi mẫu định dạng.

+0

'DecimalFormat' có cùng một vấn đề với điều này. Hay bạn có một ví dụ? – Jonas

2

Integer.parseInt(String) sẽ ném một NumberFormatException trên tất cả các ví dụ của bạn. Tôi không chắc đó có phải là điều bạn đang tìm kiếm hay không, nhưng nó chắc chắn "nghiêm khắc hơn".

6

Có lẽ đây sẽ giúp:

String value = "number_to_be_parsed".trim(); 
NumberFormat formatter = NumberFormat.getNumberInstance(); 
ParsePosition pos = new ParsePosition(0); 
Number parsed = formatter.parse(value, pos); 
if (pos.getIndex() != value.length() || pos.getErrorIndex() != -1) { 
    throw new RuntimeException("my error description"); 
} 

(Nhờ Strict number parsing at mynetgear.net)

+0

Cảm ơn bạn - đây là câu trả lời thực sự chỉ giải quyết! Các khác không xem xét địa phương (như dấu phân cách thập phân). Chỉ cần tự hỏi tại sao địa ngục này không phải là (ít nhất là cấu hình) trong việc thực hiện mặc định: ( – Rainer

0

tôi sẽ không sử dụng thường xuyên định dạng số java, đặc biệt là với các thiết lập miền địa phương nếu bạn lo lắng về việc xác nhận.

Locale numberLocale = new Locale(“es”,”ES"); 
    NumberFormat nf = NumberFormat.getInstance(numberLocale); 
    ParsePosition pos = new ParsePosition(0); 
    Number test = nf.parse("0.2", pos); 

Bạn mong đợi có vấn đề ở đây, nhưng không .. kiểm tra bằng 2 và pos có chỉ mục 3 và chỉ số lỗi là -1.

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