带句点和逗号的自定义格式化数字

时间:2012-10-03 15:13:46

标签: java formatting

this question有些相关以及与格式化小数相关的其他几个SO问题(在这种情况下,所有这些都没有帮助我)。

我正在尝试将Long格式化为字符串,例如123456 - > 012.345,6(句号后跟逗号看起来很奇怪,这是项目要求)。

我正在尝试使用DecimalFormat进行格式化:

  

private static final DecimalFormat format = new DecimalFormat(“## 0.000,0”);

然而,它在实例化期间抛出异常:

  

java.lang.IllegalArgumentException:格式错误的模式“## 0.000,0”

我还尝试过预先将区域设置更改为EU系统,例如

  

NumberFormat numberFormat = NumberFormat.getNumberInstance(Locale.GERMAN);

如何以这种方式格式化数字? DecimalFormat是错误的解决方案吗?我可以使用NumberFormat吗?或者我需要自定义格式化程序吗?

5 个答案:

答案 0 :(得分:7)

您应该避免直接构建DecimalFormat。逗号始终用于在模式定义中进行分组,而不管它们在目标语言环境中的显示方式。同样,句点总是用于小数。这似乎不合逻辑,但必须记住这是一个模式定义,和#一样,这些字符描述的是替换,而不是字符本身。

NumberFormat f = NumberFormat.getInstance(Locale.GERMANY);
if (f instanceof DecimalFormat) {
    ((DecimalFormat) f).applyPattern("##0,000.0");
}
f.format(123456 / 10.0);

需要除以10来获得小数点后的数字。

答案 1 :(得分:1)

http://docs.oracle.com/javase/6/docs/api/java/text/DecimalFormat.html

让我们试试这个

new DecimalFormat(“0 ##,###。0”);

记住,逗号是分隔符,分数是分数。你无法切换那两个。

此格式将打印前导零,两个重要数字,然后是三位数,然后是小数,如果是圆数,则打印0。我想。

所以,你能得到的最好的是 123456-> 012,345.6

解决方法:

int index1 = string.indexOf(',');
int index2 = string.indexOf('.');
string.setCharAt(index1, '.');
string.setCharAt(index2, ',');

答案 2 :(得分:1)

很抱歉,如果我错过了您的请求,但如果您需要非标准号码表示,那么您可以写一个格式化器就足够了:

static String formatLong(long value) {
        String ret = Long.toString(value);

        // Make the value 7 digits by prepending 0's
        while(ret.length()<7) ret="0"+ret;

        // Add a comma before the last digit
        ret = ret.substring(0,ret.length()-1)+","+ret.substring(ret.length()-1);

        // Add a period before the 4th digit
        ret = ret.substring(0,ret.length()-5)+"."+ret.substring(ret.length()-5);

        return ret;
    }

long a = 123456;
System.out.println(formatLong(a));

打印“012.345,6”

答案 3 :(得分:0)

您可以使用DecimalFormatSymbols类将分组和小数分隔符设置为您想要的任何字符。 Java教程中显示了一个示例(在“更改格式符号”部分中):http://docs.oracle.com/javase/tutorial/i18n/format/decimalFormat.html

在模式中,分组总是用,表示,小数点用.表示。

答案 4 :(得分:0)

根据我对javadoc的解读,DecimalFormat仅支持数字的整数部分中的“分组”;即之前小数位。

  • 格式字符串的语法暗示了这一点,','之前只允许'.'

  • setGroupingSize(int)的javadoc暗示了

      

    “分组大小是分组分隔符在数字的整数部分之间的位数。