documentationには、変数を文字列に変換するために使用されるロケールは含まれていません。例:kotlinの文字列テンプレートにはどのロケールが使用されていますか?
val d = 0.1234
val s = "$a"
がs
私のマシンのローカル(de_AT
)を反映している0.1234
または0,1234
でしょうか?
調整する方法は?
documentationには、変数を文字列に変換するために使用されるロケールは含まれていません。例:kotlinの文字列テンプレートにはどのロケールが使用されていますか?
val d = 0.1234
val s = "$a"
がs
私のマシンのローカル(de_AT
)を反映している0.1234
または0,1234
でしょうか?
調整する方法は?
TL; DR:調整できません。
文字列補間を使用するときにバイトコードを見ると、StringBuilder
が使用されていることがわかります(現代のJavaコンパイラでは+
の連結と同じです)。
単なる例として、あなたはこのコードを取る場合:
val kt = "Kotlin"
println("hello $kt")
(適度に読みやすいです)バイトコードの動作は次のようになり、文字列テンプレート:バックポイントへ
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
。では、double
を追加するときに、StringBuilder
が使用するのは問題です。ドキュメントを参照する場合は、String.valueOf(double)
メソッドを使用し、次にDouble.toString(double)
メソッドを使用します。ドキュメントhereを参照すると、与えられた値のフォーマット方法がわかります。短い要約:小数点の区切り文字として.
を使用し、非常に小さい数値と非常に大きな数値に対してはE
という指数表記を使用します。
別のフォーマットをしたい場合は、最後のリンクのドキュメントにNumberFormat
を使用するように指示されています。またLocale
に渡すことができるString.format
を提案します。
ありがとう@ zsmb13、検査のためにバイトコードを使用する巧妙な考え。 – linqu