是否有可能为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()。
答案 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检查来包装日志语句来污染代码 - 这可能会或可能不会更好,具体取决于品味。