2

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

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

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

私有静态最终 DecimalFormat 格式 = new DecimalFormat("##0.000,0");

但是它在实例化过程中抛出异常:

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

我还尝试过预先将语言环境更改为欧盟系统,例如

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

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

4

5 回答 5

7

您应该避免DecimalFormat直接构建。逗号始终用于模式定义中的分组,无论它们在目标语言环境中如何显示。同样,句点始终用于小数。这看起来不合逻辑,但必须记住这是一个 模式定义,并且像 # 一样,这些字符描述的是替换,而不是字符本身。

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

需要除以 10 才能获得小数点后的一位数。

于 2012-10-03T15:25:00.913 回答
1

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

让我们试试这个

新的 DecimalFormat("0##,###.0");

请记住,逗号是分隔符,点是分数。你不能切换这两个。

这种格式将打印前导零,两个重要数字,然后是三个数字,然后是小数,如果是整数,则为 0。我认为。

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

解决方法:

int index1 = string.indexOf(',');
int index2 = string.indexOf('.');
string.setCharAt(index1, '.');
string.setCharAt(index2, ',');
于 2012-10-03T15:16:20.960 回答
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”

于 2012-10-03T15:34:43.763 回答
0

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

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

于 2012-10-03T15:24:37.200 回答
0

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

  • 格式字符串的语法暗示了这一点,其中','仅允许在'.'.

  • javadoc 也暗示了这一点,setGroupingSize(int)其中说

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

于 2012-10-03T15:37:16.403 回答