Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 十进制模式问题_Java_Android - Fatal编程技术网

Java 十进制模式问题

Java 十进制模式问题,java,android,Java,Android,我尝试在Android中使用NumberFormatter格式化一个数字。我使用下面的代码,它工作得非常完美: NumberFormat formatter = new DecimalFormat("###,###"); String myFormattedString = formatter.format(123456); 但是,当我使用带空格的模式时,比如:new DecimalFormat(“####,###”)它抛出一个非法argumentException。我阅读了有关Numbe

我尝试在Android中使用NumberFormatter格式化一个数字。我使用下面的代码,它工作得非常完美:

 NumberFormat formatter = new DecimalFormat("###,###");
 String myFormattedString = formatter.format(123456);
但是,当我使用带空格的模式时,比如:
new DecimalFormat(“####,###”)
它抛出一个
非法argumentException
。我阅读了有关NumberFormatter和DecimalFormatter的文档,但没有发现任何关于模式中空格的内容。有人能解释我为什么不能使用空格,或者如何将它们添加为允许的字符吗。
提前感谢

< P>你不能在一个数字的中间放空格:它不是有效的格式。< /P> 如果你看一下,你会看到:

前缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 后缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 编号: 整数指数选择 整数分数指数

不复制整个文档,“代码>编号模式中的任何组件都不接受空格,所以尝试在中间安装一个空间是行不通的。你只能在前缀或后缀中使用空格。

你不能在一个数字的中间放空格:它不是有效的格式。< /P> 如果你看一下,你会看到:

前缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 后缀: 除\uFFFE、\uFFFF和特殊字符以外的任何Unicode字符 编号: 整数指数选择 整数分数指数

不复制整个文档,“代码>编号模式中的任何组件都不接受空格,所以尝试在中间安装一个空间是行不通的。只能在前缀或后缀中使用空格。

在常规JDK中,这不会引发异常-它只是将数字格式化为
123456

不清楚您的示例中的空格是什么。对于符号的角色,您有两个选项:

  • 小数分隔符
  • 组分隔符
  • 指数分离器
  • 货币小数分隔符
您可以使用以下各项进行设置:

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

在常规JDK中,这不会引发异常-它只是将数字格式化为
123456

不清楚您的示例中的空格是什么。对于符号的角色,您有两个选项:

  • 小数分隔符
  • 组分隔符
  • 指数分离器
  • 货币小数分隔符
您可以使用以下各项进行设置:

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

通过使用standart formatter创建自己的格式化程序,并使用例外查找禁止的符号,我实现了我的目标。希望对其他人有用

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();
    }
公共静态字符串getFormattedNumberWithPattern,
浮点数(个){
字符串lFormattedNumber=null;
字符串lOriginalPattern=aPattern;
试一试{
Hashtable lIlligalChars=新的Hashtable();
//分析非法字符
对于(int i=apatern.length()-1;i>=0;i--){
char[]lAux=新字符[1];
阿帕特尔·盖查斯(i,i+1,劳克斯,0);
试一试{
//如果字符是非法的,它将抛出一个异常
@抑制警告(“未使用”)
NumberFormat lNumberFormatter=新的十进制格式(“#”
+lAux[0]+“#”)号;
}捕获(IllegalArgumentException e){
//向字典中添加非法字符和索引
lIlligalChars.put(新整数(i),String.valueOf(lAux[0]);}
枚举lChars=lIlligalChars.elements();
while(lChars.hasMoreElements()){
字符串lIllegalChar=lChars.nextElement();
//从模式中删除非法字符
aPattern=removeChar(aPattern,lIllegalChar.charAt(0));
}
//使用合法模式设置数字格式
NumberFormat lNumberFormatter=新的十进制格式(APTern);
lFormattedNumber=lNumberFormatter.format(一个编号);
int-lLenghtDifference=lOriginalPattern.length()
-lFormattedNumber.length();
//使用非法字符的索引向格式化字符串添加非法字符
枚举lKeys=lIlligalChars.keys();
while(lKeys.hasMoreElements()){
整数lIllegalCharIndex=lKeys.nextElement();
int lInsertIndex=lIllegalCharIndex.intValue()
-朗赫特差异;
//在格式化的数字中插入非法字符
如果(lInsertIndex>=0
||lInsertIndex
通过使用standart formatter创建自己的格式化程序,并使用例外查找禁止的符号,我实现了我的目标。希望对其他人有用

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();
    }
公共静态字符串getFormattedNumberWithPattern,
浮点数(个){
字符串lFormattedNumber=null;
字符串lOriginalPattern=aPattern;
试一试{
Hashtable lIlligalChars=新Hashta