2012-03-21 22 views
6

En el documento de la clase NumberFormat de GWT (http://google-web-toolkit.googlecode.com/svn/javadoc/1.5/com/google/gwt/i18n /client/NumberFormat.html) leí:Cómo especificar el separador de miles y decimales utilizado por el NúmeroFormato de GWT

"los prefijos, sufijos, y diversos símbolos utilizados para el infinito, dígitos, separadores de miles, separadores decimales, etc. se puede establecer en valores arbitrarios, y Aparecerán correctamente durante el formateo. Sin embargo, se debe tener cuidado de que los símbolos y las cadenas no entren en conflicto o el análisis no sea confiable. Por ejemplo, el separador decimal y el separador de miles deben ser caracteres distintos, o el análisis será imp posible ".

Mi pregunta es, ¿cómo me aseguro de que "." se usa como separador de miles y "," como separador decimal independientemente de la configuración regional del usuario? En otras palabras, cuando uso el patrón "###, ###, ###. ######" Quiero que GWT formatee el valor doble 1234567.89 siempre como "1.234.567,89" no importa cuál es la configuración regional del usuario.

+0

Actualizado a mis respuestas finales. Parece que GWT planea respaldar esto, pero aún no lo ha hecho. Ver mi truco sugerido. –

Respuesta

4

Resolviendo esto tomó un trabajo. Desde docs y source para NumberFormatter, parece que solo se pueden usar configuraciones regionales para establecer estos valores. Dicen que puede configurar separador de grupo, pero ninguno de esos ejemplos funcionó para mí. Si bien puede pensar que la forma de Java para hacer esto en la parte inferior funcionaría, ya que GWT emula las clases DecimalFormat y DecimalFormalSymbols, no las formally support. Quizás lo harán en el futuro. Además, dicen en el LocaleInfo class que puede modificar una configuración regional, no encontré ningún método que lo permita.

lo tanto, aquí es el manera Hack para hacerlo:

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

manera correcta, pero aún no GWT apoyaron:

Utilice el formateador decimales:

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

La salida:

2 @ 342 @ 442,23

+0

Cuando trato de usar DecimalFormat obtengo: "class 'java.text.DecimalFormat' no está presente en la biblioteca de emulación JRE, por lo que no se puede usar en el código de cliente". – user375354

+0

Dang ... extraño porque está emulado. Publicaré a los desarrolladores de GWT. –

3

me encontré con el mismo problema.Lo resuelto de esta manera:

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

La forma en que he usado es anular de LocaleInfoImpl de esta manera la GWT:

  1. Echando un vistazo a LocaleInfo se puede ver que utiliza una instancia estática privada LocaleInfo line 36 que construimos utilizando GWT.create(LocaleInfoImpl.class)
  2. usando GWT Deferred binding podemos anular el LocalInfoImpl por una implementación personalizada:
<replace-with class="your.app.package.to.CustomLocaleInfoImpl"> 
    <when-type-is class="com.google.gwt.i18n.client.impl.LocaleInfoImpl" /> 
</replace-with> 
  1. Extender la LocaleInfoImpl de una manera similar a esto, simplemente reemplazando el método 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(); 
      } 
     }; 
    } 
} 
Cuestiones relacionadas