2015-06-11 26 views
8

Tôi có một JFormattedTextField với một NumberFormat với Locale.US. Vì vậy, dấu tách thập phân là điểm và dấu tách nhóm là dấu phẩy.Số phân tích cú pháp không đủ nghiêm ngặt

Bây giờ tôi nhập chuỗi "1,23" vào trường văn bản này và di chuyển tiêu điểm đến thành phần khác. Tôi hy vọng chuỗi sẽ biến mất (giống như khi tôi gõ "a" thay vì "1,23") bởi vì nó rõ ràng không phải là biểu diễn hợp lệ của một số khi sử dụng Locale.US. Nhưng thay vào đó, văn bản trong trường văn bản được thay đổi thành "123".

Điều này là do NumberFormat được sử dụng không nghiêm ngặt khi phân tích cú pháp và chỉ đơn giản là bỏ qua dấu phẩy.

Câu hỏi: Làm cách nào tôi có thể yêu cầu NumberFormat ném ParseException trong trường hợp này để trường văn bản trống sau khi di chuyển tiêu điểm đến thành phần khác?

Mã kiểm tra:

JDialog dialog = new JDialog(); 
    JPanel panel = new JPanel(new BorderLayout()); 
    dialog.getContentPane().add(panel); 

    NumberFormat nf = NumberFormat.getInstance(Locale.US); 
    JFormattedTextField textField = new JFormattedTextField(nf); 
    textField.setText("1,23"); 
    panel.add(textField, BorderLayout.CENTER); 
    panel.add(new JButton("focus"), BorderLayout.EAST); 

    dialog.pack(); 
    dialog.setVisible(true); 

Di chuyển trọng tâm từ các trường văn bản để các nút và các văn bản sẽ thay đổi để "123".

+1

Đây không phải là bản sao. Câu hỏi khác là về số nguyên, không phải là gấp đôi. Câu hỏi ở đây sẽ tóm tắt một NumberFormat quá khoan dung, không kiểm tra xem dấu phẩy tại vị trí đó có được phép hay không. Có vẻ như chúng ta cần một lớp con của NumberFormat với việc kiểm tra chặt chẽ hơn. –

+1

@RalfH: Bạn nói đúng, đây không phải là bản sao. Tôi đã chỉnh sửa các câu hỏi để hiển thị việc sử dụng cơ bản của NumberFormat trong JFormattedTextField. –

+1

Tôi làm cách nào để lấy nhãn trùng lặp khỏi câu hỏi này? Tôi muốn đăng giải pháp của riêng tôi. –

Trả lời

3

tôi sẽ đề nghị bạn sử dụng regex và sử dụng fucntion trận đấu như thế này:

matches("\\d+([.,])?") 

Ngoài ra nếu bạn sẽ sử dụng Integer.parseInt(String) sẽ ném một ngoại lệ nếu nó sẽ được phân tích hoặc bạn có thể sử dụng Double.parseDouble(value)

0

Trên thực tế, Number chỉ là một lớp siêu cho Double, vì vậy bạn có thể sử dụng Double.parseDouble(...) và sau đó tự động hủy hộp phải thực hiện phần còn lại.

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