2011-07-14 3 views
0

Je tente de formater un nombre à l'aide de NumberFormatter dans Android. J'utilise le code ci-dessous et il fonctionne parfaitement:Problème de motif DecimalFormat

NumberFormat formatter = new DecimalFormat("###,###"); 
String myFormattedString = formatter.format(123456); 

Mais, quand j'utiliser un modèle avec l'espace, comme ça: new DecimalFormat("###,# ##"); il jette un IllegalArgumentException. J'ai lu de la documentation sur NumberFormatter et DecimalFormatter et n'ai rien trouvé sur les espaces dans les patterns. Quelqu'un peut-il m'expliquer pourquoi je ne peux pas utiliser des espaces ou comment les ajouter comme caractères autorisés. Merci d'avance !!!

Répondre

4

Vous ne pouvez pas placer d'espaces au milieu d'un nombre: ce n'est pas un format valide.

Si vous regardez the JavaDoc of DecimalFormat, vous verrez ceci:

 
Prefix: 
     any Unicode characters except \uFFFE, \uFFFF, and special characters 
Suffix: 
     any Unicode characters except \uFFFE, \uFFFF, and special characters 
Number: Integer Exponentopt Integer . Fraction Exponentopt 

Sans la copie du document entier, aucun des composants du modèle Number acceptent des espaces, donc essayer d'adapter un espace au milieu ne fonctionnera pas. Vous pouvez uniquement utiliser des espaces dans le préfixe ou le suffixe.

3

Dans un JDK standard, cela ne crée pas d'exception - il formate simplement le nombre en 123,456.

Il n'est pas clair quel est l'espace dans votre exemple. Vous avez deux options pour un rôle de symbole:

  • séparateur décimal
  • séparateur de groupe
  • séparateur exposant
  • séparateur décimal monétaire

Vous pouvez régler chacun de ceux-ci avec:

DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols(); 
symbols.setGroupingSeparator(' '); 
formatter.setSymbols(symbols); 
0

J'ai atteint mon g oal en faisant mon propre formateur en utilisant standart formateur et en trouvant des symboles interdits en utilisant des exeptions. J'espère que ce sera utile pour quelqu'un d'autre.

public static String getFormattedNumberWithPattern(String aPattern, 
      float aNumber) { 
     String lFormattedNumber = null; 
     String lOriginalPattern = aPattern; 
     try { 
      Hashtable<Integer, String> lIlligalChars = new Hashtable<Integer, String>(); 
      // analyze illegal characters 
      for (int i = aPattern.length() - 1; i >= 0; i--) { 
       char[] lAux = new char[1]; 
       aPattern.getChars(i, i + 1, lAux, 0); 
       try { 
        // if character is illegal, it throws an exception 
        @SuppressWarnings("unused") 
        NumberFormat lNumberFormatter = new DecimalFormat("#" 
          + lAux[0] + "#"); 
       } catch (IllegalArgumentException e) { 
        // add illegal chars and indexes to dictionary 
        lIlligalChars.put(new Integer(i), String.valueOf(lAux[0]));}} 
      Enumeration<String> lChars = lIlligalChars.elements(); 
      while (lChars.hasMoreElements()) { 
       String lIllegalChar = lChars.nextElement(); 
       // remove illegal chars from pattern 
       aPattern = removeChar(aPattern, lIllegalChar.charAt(0)); 
      } 

      // format number using legal pattern 
      NumberFormat lNumberFormatter = new DecimalFormat(aPattern); 
      lFormattedNumber = lNumberFormatter.format(aNumber); 

      int lLenghtDifference = lOriginalPattern.length() 
        - lFormattedNumber.length(); 
      // add illegal chars to formatted string using their indexes 
      Enumeration<Integer> lKeys = lIlligalChars.keys(); 
      while (lKeys.hasMoreElements()) { 
       Integer lIllegalCharIndex = lKeys.nextElement(); 
       int lInsertIndex = lIllegalCharIndex.intValue() 
         - lLenghtDifference; 
       // insert illegal chars into formatted number 
       if (lInsertIndex >= 0 
         || lInsertIndex < lFormattedNumber.length()) { 
        lFormattedNumber = new StringBuffer(lFormattedNumber) 
          .insert(lInsertIndex, 
            lIlligalChars.get(lIllegalCharIndex) 
              .charAt(0)).toString(); 
       } 
      } 
     } catch (Exception e) { 
//   Log.d("info", "formater error:" + e + "mask: " + aPattern 
//     + " number:" + aNumber); 
     } 

     return lFormattedNumber; 
    } 

public static String removeChar(String s, char c) { 
     StringBuffer r = new StringBuffer(s.length()); 
     r.setLength(s.length()); 
     int current = 0; 
     for (int i = 0; i < s.length(); i++) { 
      char cur = s.charAt(i); 
      if (cur != c) 
       r.setCharAt(current++, cur); 
     } 
     r.setLength(current); 
     return r.toString(); 
    }