2017-03-16 4 views

Antwort

8

TL; DR: Sie können es nicht einstellen.

Wenn Sie den Bytecode betrachten, wenn Sie die Zeichenfolgeninterpolation verwenden, werden Sie sehen, dass StringBuilder unter der Haube verwendet wird (was dem entspricht, was moderne Java-Compiler mit + Verkettung machen).

Nur als Beispiel, wenn Sie nehmen diesen Code:

val kt = "Kotlin" 
println("hello $kt") 

Der String Template Betrieb wie dies in der Bytecode sieht (die mäßig lesbar ist):

LINENUMBER 8 L2 
NEW java/lang/StringBuilder 
DUP 
INVOKESPECIAL java/lang/StringBuilder.<init>()V 
LDC "hello " 
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
ALOAD 1 
INVOKEVIRTUAL java/lang/StringBuilder.append (Ljava/lang/String;)Ljava/lang/StringBuilder; 
INVOKEVIRTUAL java/lang/StringBuilder.toString()Ljava/lang/String; 
ASTORE 2 

Zurück zum Punkt . So, jetzt ist die Frage, was StringBuilder verwendet, wenn Sie eine double daran anhängen. Wenn Sie die Dokumentation nachschlagen, wird die String.valueOf(double)-Methode verwendet, die wiederum Double.toString(double) verwendet, für die Sie die Dokumentation here finden können, um zu sehen, wie sie die angegebenen Werte formatiert. Kurze Zusammenfassung: Es verwendet . als Dezimaltrennzeichen und gibt Ihnen eine exponentielle Notation mit E für sehr kleine und sehr große Zahlen. Die Dokumentation im letzten Link schlägt vor, NumberFormat zu verwenden, wenn Sie es anders formatieren möchten. Ich würde auch vorschlagen, String.format, die Sie eine Locale zu übergeben können.

+2

danke @ zsmb13, clevere Idee, den Bytecode für die Inspektion zu verwenden. – linqu

Verwandte Themen