2012-03-21 9 views
6

Nel doc della classe NumberFormat di GWT (http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/i18n /client/NumberFormat.html) leggo:Come specificare il separatore delle migliaia e dei decimali utilizzato da NumberFormat di GWT

"I prefissi, suffissi e vari simboli utilizzati per sfioro, cifre, separatori di migliaia, separatori decimali, ecc può essere impostata a valori arbitrari, e appariranno correttamente durante la formattazione, tuttavia, è necessario prestare attenzione che i simboli e le stringhe non siano in conflitto o l'analisi non sia affidabile.Ad esempio, il separatore decimale e il separatore delle migliaia devono essere caratteri distinti, oppure l'analisi sarà imp ossible."

La mia domanda è, come faccio ad assicurarmi che "." viene utilizzato come separatore delle migliaia e "," come separatore decimale indipendentemente dalle impostazioni locali dell'utente? In altre parole quando uso il modello "###, ###, ###. ######" Voglio che GWT formatta il doppio valore 1234567.89 sempre come "1.234.567,89" no importa quale sia la locale dell'utente.

+0

Aggiornato alle mie risposte definitive. Sembra che GWT stia pianificando di supportarlo, ma non lo ha ancora fatto. Vedi il mio suggerimento hack. –

risposta

4

Risolvere questo ha richiesto un po 'di lavoro. Da e source per NumberFormatter, sembra che solo le Local possano essere utilizzate per impostare questi valori. Dicono che è possibile impostare il separatore di gruppo ma nessun esempio ha funzionato per me. Mentre si potrebbe pensare che il modo Java per farlo in fondo funzionerebbe dal momento che GWT emula le classi DecimalFormat e DecimalFormalSymbols, esse non sono formally support. Forse lo faranno in futuro. Inoltre, dicono nello LocaleInfo class che è possibile modificare una localizzazione, non ho trovato nessun metodo che consenta questo.

Quindi, ecco il Hack modo per farlo:

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

modo giusto, ma non ancora GWT supportati:

Utilizzare il formattatore decimali:

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

L'output:

2 @ 342 @ 442,23

+0

Quando provo ad usare DecimalFormat ottengo: "classe 'java.text.DecimalFormat' non è presente nella libreria di emulazione JRE in modo che non possa essere usata nel codice client". – user375354

+0

Dang ... dispari poiché è emulato. Pubblicherò gli sviluppatori di GWT. –

3

Ho appena incontrato lo stesso problema.Ho risolto in questo modo:

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

Il modo che ho usato è Override del LocaleInfoImpl in questo modo GWT:

  1. Dando uno sguardo al LocaleInfo si può vedere utilizza un'istanza statica privata LocaleInfo line 36 che costruiamo usando GWT.create(LocaleInfoImpl.class)
  2. usando GWT Deferred binding possiamo ignorare il LocalInfoImpl da un'implementazione personalizzata:
<replace-with class="your.app.package.to.CustomLocaleInfoImpl"> 
    <when-type-is class="com.google.gwt.i18n.client.impl.LocaleInfoImpl" /> 
</replace-with> 
  1. Estendere il LocaleInfoImpl in un modo simile di questo, solo l'override del metodo 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(); 
      } 
     }; 
    } 
} 
Problemi correlati