Java 在SLF4J中格式化浮点数

Java 在SLF4J中格式化浮点数,java,logging,slf4j,Java,Logging,Slf4j,我想用SLF4J将我的双精度和浮点数格式化为小数位数 基本上,我在SLF4J中寻找Java的String.format(“%.2f”,floatValue)的等价物 在阅读了SLF4J的文档并在谷歌上搜索之后,我找不到它是否具有该功能的提示 我使用的是slf4j-api:1.7.6和slf4j-jdk14:1.7.6 非常感谢您的帮助。我假设您指的是SLF4J的扩展参数约定,例如: float f; ... logger.debug("My number is {}", f); 因此,答案是否

我想用SLF4J将我的双精度和浮点数格式化为小数位数

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

在阅读了SLF4J的文档并在谷歌上搜索之后,我找不到它是否具有该功能的提示

我使用的是
slf4j-api:1.7.6
slf4j-jdk14:1.7.6


非常感谢您的帮助。

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

float f;
...
logger.debug("My number is {}", f);
因此,答案是否定的。从SLF4J 1.7.7开始,您要求执行的操作是不可能的,因为SLF4J的扩展算法不允许自定义渲染器(例如通过Log4J提供的渲染器)

不过,似乎值得一个功能请求

编辑

嗯,
{}
是“仅支持”性能方面的考虑,当前的格式化实现比String.format()好10倍。 所以不太可能改变


()

导致创建临时对象的有点丑陋的解决方案可能是

public class DelayedFormatter {
    public static Object format(String format, Object... args) {
        return new Object() {
            @Override
            public String toString() {
                return String.format(format, args);
            }
        };
    }
}
然后

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

这实际上是一个解决方法,不是答案,因此我将添加它作为注释:您可以将
String.format
的输出作为记录器调用中的参数传递:
logger.debug(“floatValue是{}”,String.format(%.2f,floatValue))这违背了SLF4Js参数化日志记录的目的,即避免在未发出日志消息的情况下进行计算。在这种情况下,如果(logger.isDebugEnabled())logger.debug(…调用String.format…),则将调用包装到
if(logger.isDebugEnabled())
以避免整个混乱。@ToddFred您将避免消息的字符串串联,这将减少一些开销。优雅的方法