2014-03-28 150 views
24

我想用SLF4J格式化我的双精度值和浮点数到一定的小数位数。格式化SLF4J中的浮点数

基本上,我在寻找SLF4J中Java的String.format("%.2f", floatValue)的等价物。

通过阅读SLF4J的文档和谷歌搜索我找不到提示它是否具有该功能。我使用slf4j-api:1.7.6slf4j-jdk14:1.7.6

任何帮助

是非常赞赏。

+4

这真的是一个解决方法,而不是一个答案,所以我会l将它添加为注释:您可以在记录器调用中将'String.format'的输出作为参数传递:'logger.debug(“floatValue is {}”,String.format(“%。2f”,floatValue ));' – megaflop

+4

这违背了SLF4Js参数化日志记录的目的,这避免了在未发出日志消息时的评估。 –

+0

在这种情况下,将调用封装在'if(logger.isDebugEnabled())logger.debug(...调用String.format ....);'以避免整个混乱。 –

回答

18

我假设你指的是扩大参数的SLF4J的约定,例如:

float f; 
... 
logger.debug("My number is {}", f); 

所以,答案是否定的。从SLF4J 1.7.7开始,你要求做的事情是不可能的,因为SLF4J的扩展算法不允许定制渲染器(例如通过Log4J提供的渲染器)。

虽然,似乎值得功能请求。

编辑

好,{}是 “只支持” 出于性能考虑,当前格式实现优于的String.format()的10倍。 http://www.slf4j.org/faq.html#logging_performance 所以它不可能改变

source

11

一个有点丑陋的解决方案,即被临时对象的创建可能是这个

public class DelayedFormatter{ 
    String format; Object[] args; 

    public DelayedFormatter(String format, Object... args){ 
    this.format = format; this.args = args; 
    } 

    public static DelayedFormatter format(String format, Object... args){ 
    return new DelayedFormatter(format, args); 
    } 

    @Override public String toString(){ 
    return String.format(format, args); 
    } 
} 

然后

import static DelayedFormatter.format; 
... 
logger.debug("v = {}", format("%.03f", v)); 
+0

优雅的方法 – sofend