2014-03-28 12 views
24

Ich möchte meine Doubles und Floats mit SLF4J auf eine bestimmte Anzahl von Dezimalstellen formatieren.Fließkommazahlen formatieren in SLF4J

Grundsätzlich bin ich auf der Suche nach dem Äquivalent von Java String.format("%.2f", floatValue) in SLF4J.

Nachdem ich die Dokumentation von SLF4J gelesen und gegoogelt habe, konnte ich keinen Hinweis finden, ob es diese Funktion hat.

Ich slf4j-api:1.7.6 und slf4j-jdk14:1.7.6

Jede Hilfe verwendet, wird sehr geschätzt.

+4

Dies ist wirklich ein Workaround, keine Antwort, also werde ich Ich füge es als Kommentar hinzu: Sie könnten einfach die Ausgabe von 'String.format' als Argument in Ihrem Logger-Aufruf übergeben:' logger.debug ("floatValue is {}", String.format ("%. 2f", floatValue))); ' – megaflop

+4

Dies verhindert den Zweck der parametrisierten Protokollierung von SLF4J, wodurch eine Auswertung vermieden wird, wenn Protokollmeldungen nicht ausgegeben werden. –

+0

In diesem Fall wäre es am schnellsten, den Aufruf in 'if (logger.isDebugEnabled()) logger.debug (... ruft zu String.format ....);' um das ganze Chaos zu vermeiden. –

Antwort

18

Ich gehe davon aus, dass Sie auf SLF4J der Konvention der Erweiterung Parameter sich beziehen, z.B .:

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

Also, die Antwort ist nein. Ab SLF4J 1.7.7 ist das, was Sie tun möchten, unmöglich, da der SLF4J-Erweiterungsalgorithmus keine benutzerdefinierten Renderer (wie den über Log4J verfügbaren) erlaubt.

Scheint einer Feature-Anforderung würdig, obwohl.

EDIT:

Nun, {} ist "nur unterstützt" für Leistungsinformationen, aktuelle Formatierung Implementierung trifft String.format() auf das 10-fache. http://www.slf4j.org/faq.html#logging_performance so ist es unwahrscheinlich,

(source)

11

Eine etwas hässliche Lösung zu ändern, die die Schaffung eines temporären Objekt entstehen

dies sein könnte
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); 
    } 
} 

und dann

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

eleganter Ansatz – sofend