Tôi có một đơn giản EditText
, cho phép người dùng nhập một số như 45.60
(ví dụ cho Đô la Mỹ). sau đó tôi định dạng con số này bằng cách sử dụng phương pháp sau đây:NumberFormat.parse() không thành công cho một số chuỗi tiền tệ
public String format() {
NumberFormat formatter = NumberFormat.getCurrencyInstance(Locale.getDefault());
return formatter.format(amount.doubleValue());
}
Và trên điện thoại Android của tôi, ngôn ngữ được thiết lập để tiếng Anh (Hoa Kỳ) - vì thế Locale.getDefault()
nên trả lại locale Mỹ (và nó).
Bây giờ văn bản chỉnh sửa được cập nhật chính xác thành: $45.60
(do đó định dạng số đã nhập hoạt động).
Tuy nhiên, nếu tôi cố gắng để phân tích các chuỗi trên "$45.60"
bằng cách sử dụng phương pháp sau đây:
NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
Number result = numberFormat.parse("$45.60");
Nó không thành công với:
java.lang.IllegalArgumentException: Failed to parse amount $45.60 using locale en_US.
Nếu tôi đặt điện thoại của tôi sang tiếng Anh/Anh, định dạng "45.60"
này để "£45.60"
hoạt động chính xác (như đối với Hoa Kỳ), tuy nhiên phân tích cú pháp "£45.60"
không thành công, giống như đối với mẫu ở trên ở Hoa Kỳ.
Tuy nhiên, nếu tôi đặt điện thoại sang tiếng Đức (Đức), định dạng "45,60"
thành "45,60€"
hoạt động chính xác và phân tích cú pháp "45,60€"
hoạt động chính xác!
Sự khác biệt duy nhất tôi thấy giữa ba loại tiền tệ sau: Đồng Euro được cộng vào số tiền, trong khi Đô la và Bảng Anh được thêm vào số tiền đó.
Có ai có ý tưởng không, tại sao cùng một mã hoạt động cho Euro, nhưng không phải cho Bảng Anh và Đô la? Tui bỏ lỡ điều gì vậy?
Tôi cũng đã tạo ra một đơn vị kiểm tra, để tạo lại vấn đề:
public void testCreateStringBased() throws Exception {
// For German locale
CurrencyAmount amount = new CurrencyAmount("25,46€", Locale.GERMANY);
assertEquals(25.46, amount.getAsDouble());
// For French locale
amount = new CurrencyAmount("25,46€", Locale.FRANCE);
assertEquals(25.46, amount.getAsDouble());
// For US locale
amount = new CurrencyAmount("$25.46", Locale.US);
assertEquals(25.46, amount.getAsDouble());
// For UK locale
amount = new CurrencyAmount("£25.46", Locale.UK);
assertEquals(25.46, amount.getAsDouble());
}
CurrencyAmount
về cơ bản kết thúc tốt đẹp mã tôi gửi cho phân tích chuỗi tiền tệ, ngoại trừ việc nó mất miền địa phương được thay cho miền địa phương mặc định. Trong ví dụ trên, thử nghiệm thành công cho miền địa phương GERMANY và PHÁP nhưng không thành công cho miền địa phương Hoa Kỳ và Anh.
Tôi sẽ không gọi nó là 'nghiệp dư đau đớn'. Đó là một trường hợp sử dụng phổ biến, đặc biệt là khi phân tích cú pháp đầu vào của EditText. Tôi cũng xem xét thực thi đúng định dạng (w/ký hiệu tiền tệ) trực tiếp trên EditText (bằng cách sử dụng TextWatcher), nhưng tôi kết thúc bằng cách sử dụng giải pháp này là ít xâm nhập cho người dùng. Cảm ơn. – pkk