java.text.MessageFormat没有为数字分组分隔符

时间:2017-01-24 10:12:35

标签: java messageformat

是否有可能为java.text.MessageFormat定义格式,格式化数字而不使用.toString()分隔分隔符其他对象?

我的麻烦在于我必须格式化一个参数,我不提前知道它是否是一个数字。如果我只是使用

java.text.MessageFormat.format("The object: {0}",someobject)

通常只是按我的意愿调用someobject.toString(),但当someobject实际上是一个数字1231231时,它会返回(在德语区域设置中)The object: 1,231,231,但我想要The object: 1231231在这里。使用

进行格式化
java.text.MessageFormat.format("{0,number,#}",1231231)

返回The object: 1231231,但当参数不是数字时,这不起作用。有没有办法指定适用于数字和其他对象的格式?

(如果您想知道:遗憾的是,更改MessageFormat的区域设置不是一个选项,因为它深深地埋没在JBoss的日志框架中并且无法访问。)

UPDATE :在将它作为参数传递之前调用String.valueOf(someobject)确实解决了这个问题,但在我的情况下也是不可行的,因为在记录时会出现此问题,并且当日志记录级别不允许日志消息并且因此从不应用MessageFormat时,我不想调用潜在的昂贵的someobject.toString()。

2 个答案:

答案 0 :(得分:0)

    final String format = MessageFormat.format("The object: {0}", a == null ? null : a.toString());

    System.out.println("format = " + format);

答案 1 :(得分:0)

Shylock.Gou's answer的一种变体,它可以避免在实际使用时调用someobject.toString(),因为禁止使用loglevel,可以包装对象,以便仅在使用时调用toString。不过,这似乎有点尴尬。

public Object wrapToString(Object obj) {
    return new Object() {
        /** {@inheritDoc} */
        @Override
        public String toString() {
            return String.valueOf(obj);
        }
    };
}

然后,人们还可以通过使用loglevel检查来包装日志语句来污染代码 - 这可能会或可能不会更好,具体取决于品味。

相关问题