2017-01-24 11 views
1

Gibt es eine Möglichkeit, ein Format für java.text.MessageFormat zu definieren, das Zahlen ohne Gruppierung von Trennzeichen und andere Objekte mit .toString() formatiert?java.text.MessageFormat ohne Gruppierung von Trennzeichen für Zahlen

Mein Problem ist, dass ich ein Argument formatieren muss, für das ich nicht im Voraus weiß, ob es eine Nummer ist oder nicht. Wenn ich nur

java.text.MessageFormat.format("The object: {0}",someobject) 

, die in der Regel nur Anrufe someobject.toString() wie ich will, aber wenn someobject ist tatsächlich eine Reihe 1231231, gibt es (in der deutschen locale) The object: 1,231,231, aber ich will The object: 1231231 hier. Formatieren mit

java.text.MessageFormat.format("{0,number,#}",1231231) 

kehrt The object: 1231231, aber das funktioniert nicht, wenn das Argument nicht eine Zahl ist. Gibt es eine Möglichkeit, ein Format anzugeben, das sowohl für Zahlen als auch für andere Objekte funktioniert?

(Falls Sie sich wundern: leider ist da keine Option das Gebietsschema des Message ändern, dass tief in JBoss' Logging-Framework und unzugänglich vergraben.)

UPDATE: String.valueOf Aufruf (someobject) vor der Übergabe als Argument löst dieses Problem, ist aber auch in meinem Fall nicht durchführbar, da dieses Problem bei der Protokollierung auftritt, und ich möchte nicht die potenziell teure someobject.toString() aufrufen, wenn die Protokollierungsstufe doesn Ich erlaube die Protokollnachricht nicht und das MessageFormat wird somit nie angewendet.

+0

[Hier] (http://stackoverflow.com/questions/1942118/how-doi-format-a-long-integer-as-a-string-without-separator-in-java) sie vorschlagen, anzurufen 'Long.toString()' auf die Nummer, die Sie ohne Kommas benötigen, und [es scheint zu funktionieren] (http://ideone.com/1wBpV5) – BackSlash

Antwort

0
final String format = MessageFormat.format("The object: {0}", a == null ? null : a.toString()); 

    System.out.println("format = " + format); 
+0

Vielen Dank! Dies ist in der Tat eine Idee, die das löst (ich würde vorschlagen, dafür java.lang.String.valueOf (Object) zu verwenden), hat aber leider Performance-Nachteile in meiner Einstellung - ich habe die Frage entsprechend aktualisiert. –

+0

Welches Logger-Framework haben Sie verwendet? –

+0

Jboss-Framework, das am Ende MessageFormat verwendet. –

0

Eine Variante Shylock.Gou's answer dass someobject.toString Aufruf vermeiden würde(), wenn dies tatsächlich nicht verwendet wird, da die loglevel verboten ist, könnte man das Objekt wickeln, so dass toString auf Verwendung nur genannt wird. Dies erscheint jedoch immer noch etwas peinlich.

public Object wrapToString(Object obj) { 
    return new Object() { 
     /** {@inheritDoc} */ 
     @Override 
     public String toString() { 
      return String.valueOf(obj); 
     } 
    }; 
} 

Dann wieder, könnte man auch durch wraping die Logging-Anweisung mit einer loglevel Prüfung des Code verschmutzen - was könnte oder nicht besser sein könnte, je nach Geschmack.

Verwandte Themen