2011-07-14 5 views
0

AndroidでNumberFormatterを使用して数値の書式を設定しようとしています。私は、コード怒鳴るを使用して、それは完璧に動作します:DecimalFormatパターンの問題

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

しかし、私はそのようなスペースを持つパターン、使用している場合:new DecimalFormat("###,# ##");それはIllegalArgumentExceptionをスローします。私は、NumberFormatterとDecimalFormatterについてのドキュメントを読んできており、パターンのスペースについては何も見つかりませんでした。私はスペースを使用することはできませんか、または許可された文字としてそれらを追加する方法は誰も私をexplaneできますか? 事前に感謝!

答えて

4

数値の途中にスペースを入れることはできません。これは有効な形式ではありません。そのスペースに合うようにしようと、Numberパターンの要素のどれもが、スペースを受け入れていない全体のドキュメントをコピーせずに

 
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 

:あなたはthe JavaDoc of DecimalFormatを見れば

、あなたはこれを参照してくださいよ途中で動作しません。接頭辞または接尾辞にはスペースしか使用できません。

3

通常のJDKでは、これは例外をスローしません。番号は123,456と書式設定されます。

例のスペースが何であるかは不明です。

  • 小数点区切り
  • グループ・セパレータ
  • 指数セパレータ
  • 通貨桁区切り

あなたがしてこれらのそれぞれを設定することができます:

あなたは、シンボルの役割のためのオプションのカップルを持っています
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols(); 
symbols.setGroupingSeparator(' '); 
formatter.setSymbols(symbols); 
0

私はgを達成しましたスタンドアットフォーマッタを使用して独自のフォーマッタを作成し、exeptionsを使用して禁止されたシンボルを見つけることによって、それが他の人にとって有益であることを願っています。

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(); 
    } 
関連する問題