簡體   English   中英

DecimalFormat模式問題

[英]DecimalFormat pattern problem

我嘗試在Android中使用NumberFormatter格式化數字。 我使用下面的代碼,它可以完美地工作:

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

但是,當我使用帶有空格的模式時,像這樣: new DecimalFormat("###,# ##"); 它拋出一個IllegalArgumentException 我已經閱讀了有關NumberFormatter和DecimalFormatter的文檔,但沒有發現有關模式中空格的信息。 誰能解釋我為什么不能使用空格或如何將其添加為允許的字符。 提前致謝!!!

您不能在數字中間放置空格:這不是有效格式。

如果查看DecimalFormat的JavaDoc ,將會看到以下內容:

\n : \n         \\ uFFFE,\\ uFFFF和特殊字符以外的任何Unicode字符  \n :   \n         \\ uFFFE,\\ uFFFF和特殊字符以外的任何Unicode字符  \n opt Integer .  opt整數 。  opt  選擇\n

如果不復制整個文檔,則Number模式的所有組件都不會接受空格,因此嘗試在中間填充空格將不起作用。 您只能在前綴或后綴中使用空格。

在常規JDK中,這不會引發異常-只是將數字格式設置為123,456

目前尚不清楚示例中的空間。 對於符號角色,有兩種選擇:

  • 小數點分隔符
  • 組分隔符
  • 指數分隔符
  • 貨幣小數點分隔符

您可以使用以下各項設置每個:

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

我已經實現了自己的目標,方法是使用標准格式程序制作自己的格式程序,並使用示例程序查找違禁符號。 希望對其他人有用。

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();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM