2012-06-28 28 views
5

Tôi đang sử dụng thẻ <f:convertNumber> để chuyển đổi đầu vào thập phân.f: convertNumber không ném lỗi chuyển đổi trên các ký tự chữ cái theo sau trong số thập phân

<f:convertNumber minFractionDigits="2" /> 

Nhưng nó chấp nhận ký tự chữ cái theo sau. Ví dụ: nếu tôi nhập 12345.1234AAA, nó chuyển đổi thành 12345.123. Tôi muốn nó ném một lỗi chuyển đổi trên đó thay vì cắt tỉa các ký tự chữ cái. Làm thế nào tôi có thể đạt được điều này?

Trả lời

3

Đơn giản chỉ là standard behavior của java.text.NumberFormat như được sử dụng bởi <f:convertNumber>: Nó cắt tất cả các mục sau ký tự đầu tiên không được phép (ví dụ: chữ cái hoặc dấu tách thập phân khác với ký tự được xác định trong ngôn ngữ nhập). Chuyển đổi chỉ thất bại nếu nhân vật vi phạm là lúc đầu.

Tôi không thực sự thích hành vi này vì người dùng có thể không nhận thấy giá trị đã nhập sai của mình bị cắt, dẫn đến tự động sửa lỗi không mong muốn và thậm chí tệ hơn vào giá trị sai.

Điều thú vị đủ, các trình chuyển đổi số cụ thể hoạt động khác nhau. Sử dụng <f:converter converterId="javax.faces.Double" /> không tự động xử lý đầu vào không phải số, nhưng thay vào đó không chuyển đổi. Tuy nhiên, thẻ không có thuộc tính bổ sung của convertNumber, chẳng hạn như minFractionDigits hoặc ký hiệu tiền tệ.

Một cách tiếp cận khác là viết bộ chuyển đổi tùy chỉnh của riêng bạn, mở rộng bộ chuyển đổi chuẩn như được mô tả in this answer. Sau đó bạn có thể kiểm tra giá trị cho các ký tự và trực tiếp hủy bỏ chế biến tiếp theo (ném một ngoại lệ chuyển đổi theo) nếu bạn tìm thấy bất kỳ. Nếu giá trị đã không có ký tự, bạn có thể gọi hành vi chuẩn của trình biến đổi bạn lấy được từ đó.

Hạn chế của cả hai cách là bạn mất khả năng bổ sung của convertNumber. Bạn không có các thuộc tính như minFractionDigits hoặc currencySymbol trên <f:converter>, vì vậy nếu bạn cần điều này, bạn phải tìm cách khác để chuyển vào tham số. Việc triển khai của chúng tôi không yêu cầu bất kỳ điều nào trong số này, vì vậy tôi chưa xem xét điều này nữa (chúng tôi đã tiếp cận A), nhưng this answer trình bày cách tiếp cận để làm như vậy.

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