2014-03-28 151 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