2012-03-21 39 views
6

Trong tài liệu về lớp NumberFormat của GWT (http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/i18n /client/NumberFormat.html) tôi đọc:Cách chỉ định dấu phân cách hàng nghìn và thập phân được sử dụng bởi Số thứ tự của GWT

"Các tiền tố, hậu tố, và các ký hiệu khác nhau được sử dụng để vô cực, chữ số, hàng ngàn dải phân cách, dải phân cách thập phân vv có thể được thiết lập để các giá trị tùy ý, và chúng sẽ xuất hiện đúng trong quá trình định dạng, tuy nhiên, cần chú ý rằng các ký hiệu và chuỗi không xung đột hoặc phân tích cú pháp sẽ không đáng tin cậy. Ví dụ: dấu tách thập phân và dấu phân cách hàng nghìn phải là các ký tự riêng biệt hoặc phân tích cú pháp sẽ là imp có thể. "

Câu hỏi của tôi là, làm cách nào để đảm bảo rằng "." được sử dụng làm dấu tách hàng nghìn và "," làm dấu phân cách thập phân độc lập với cài đặt ngôn ngữ của người dùng? Nói cách khác khi tôi sử dụng mẫu "###, ###, ###. ######" Tôi muốn GWT định dạng giá trị kép 1234567.89 luôn là "1,234,567,89" không vấn đề địa phương của người dùng là gì.

+0

cập nhật câu trả lời cuối cùng của tôi. Có vẻ như GWT đang có kế hoạch hỗ trợ điều này, nhưng vẫn chưa làm như vậy. Xem hack được đề xuất của tôi. –

Trả lời

4

Giải quyết việc này mất một số công việc. Từ docssource cho NumberFormatter, có vẻ như chỉ Locales mới có thể được sử dụng để đặt các giá trị này. Họ nói rằng bạn có thể đặt bộ tách nhóm nhưng không có ví dụ nào phù hợp với tôi. Trong khi bạn có thể nghĩ cách Java để làm điều này ở phía dưới sẽ hoạt động vì GWT mô phỏng các lớp DecimalFormatDecimalFormalSymbols, chúng không formally support chúng. Có lẽ họ sẽ trong tương lai. Hơn nữa, họ nói trong các LocaleInfo class mà bạn có thể sửa đổi một miền địa phương, tôi thấy không có phương pháp như vậy cho phép điều này.

Vì vậy, đây là Hack cách để làm điều đó:

NumberFormat.getFormat("#,##0.0#").format(2342442.23d).replace(",", "@"); 

cách Đúng vậy, nhưng chưa GWT hỗ trợ:

Sử dụng định dạng số thập phân:

// formatter 
    DecimalFormat format= new DecimalFormat(); 
    // custom symbol 
    DecimalFormatSymbols customSymbols=new DecimalFormatSymbols(); 
    customSymbols.setGroupingSeparator('@'); 
    format.setDecimalFormatSymbols(customSymbols); 
    // test 
    String formattedString = format.format(2342442.23d); 

Đầu ra:

2 @ 342 @ 442.23

+0

Khi cố gắng sử dụng DecimalFormat tôi nhận được: "class 'java.text.DecimalFormat' không có trong thư viện thi đua JRE vì vậy nó không thể được sử dụng trong mã máy khách". – user375354

+0

Dang ... lẻ vì nó được mô phỏng. Tôi sẽ đăng lên các nhà phát triển GWT. –

3

Tôi vừa gặp phải vấn đề tương tự.Tôi giải quyết nó như thế này:

public String formatAmount(Double amount) { 
    String pattern = "#,##0.00"; 
    String groupingSeparator = LocaleInfo.getCurrentLocale().getNumberConstants().groupingSeparator(); 
    String decimalSeparator = LocaleInfo.getCurrentLocale().getNumberConstants().decimalSeparator(); 
    NumberFormat format = NumberFormat.getFormat(pattern); 
    return format.format(amount).replace(groupingSeparator, "'").replace(decimalSeparator, "."); 
} 
0

Con đường tôi đã sử dụng là ghi đè của LocaleInfoImpl theo cách này GWT:

  1. Lấy một cái nhìn tại LocaleInfo bạn có thể thấy nó sử dụng một trường hợp tĩnh tin LocaleInfo line 36 rằng xây dựng sử dụng GWT.create(LocaleInfoImpl.class)
  2. sử dụng GWT Deferred binding chúng ta có thể ghi đè lên LocalInfoImpl bởi một thực hiện tùy chỉnh:
<replace-with class="your.app.package.to.CustomLocaleInfoImpl"> 
    <when-type-is class="com.google.gwt.i18n.client.impl.LocaleInfoImpl" /> 
</replace-with> 
  1. Mở rộng LocaleInfoImpl theo một cách tương tự như vậy, chỉ trọng phương pháp getNumberConstant:

public class CustomLocaleInfoImpl extends LocaleInfoImpl { 

    @Override 
    public NumberConstants getNumberConstants() { 
     final NumberConstants nc = super.getNumberConstants(); 
     return new NumberConstants() { 
      @Override 
      public String notANumber() { 
       return nc.notANumber(); 
      } 

      @Override 
      public String currencyPattern() { 
       return nc.currencyPattern(); 
      } 

      @Override 
      public String decimalPattern() { 
       return nc.decimalPattern(); 
      } 

      @Override 
      public String decimalSeparator() { 
       return nc.decimalSeparator(); 
      } 

      @Override 
      public String defCurrencyCode() { 
       return nc.defCurrencyCode(); 
      } 

      @Override 
      public String exponentialSymbol() { 
       return nc.exponentialSymbol(); 
      } 

      @Override 
      public String globalCurrencyPattern() { 
       return nc.globalCurrencyPattern(); 
      } 

      @Override 
      public String groupingSeparator() { 
       return "@";//or any custom separator you desire 
      } 

      @Override 
      public String infinity() { 
       return nc.infinity(); 
      } 

      @Override 
      public String minusSign() { 
       return nc.minusSign(); 
      } 

      @Override 
      public String monetaryGroupingSeparator() { 
       return nc.monetaryGroupingSeparator(); 
      } 

      @Override 
      public String monetarySeparator() { 
       return nc.monetarySeparator(); 
      } 

      @Override 
      public String percent() { 
       return nc.percent(); 
      } 

      @Override 
      public String percentPattern() { 
       return nc.percentPattern(); 
      } 

      @Override 
      public String perMill() { 
       return nc.perMill(); 
      } 

      @Override 
      public String plusSign() { 
       return nc.plusSign(); 
      } 

      @Override 
      public String scientificPattern() { 
       return nc.scientificPattern(); 
      } 

      @Override 
      public String simpleCurrencyPattern() { 
       return nc.simpleCurrencyPattern(); 
      } 

      @Override 
      public String zeroDigit() { 
       return nc.zeroDigit(); 
      } 
     }; 
    } 
} 
Các vấn đề liên quan