私は文字列の.format
メソッドを使用しようとしています。しかし、文字列に%1、%2などを配置すると、紛らわしいJavaソースコードを指すJava.util.UnknownFormatConversionExceptionがスローされます。
private void checkText(String s) {
int idx;
// If there are any '%' in the given string, we got a bad format
// specifier.
if ((idx = s.indexOf('%')) != -1) {
char c = (idx > s.length() - 2 ? '%' : s.charAt(idx + 1));
throw new UnknownFormatConversionException(String.valueOf(c));
}
}
これから私は%
charが禁止されていることを理解します。もしそうなら、引数のプレースホルダーに何を使うべきですか?
Scala 2.8を使います。
これまでの回答はすべて正しいのですが、すべてJavaです。これがScalaの例です。
val placeholder = "Hello %s, isn't %s cool?"
val formatted = placeholder.format("Ivan", "Scala")
Pythonの%
演算子 のようにformat
を作ることについてのブログ記事もあります。
位置を示すために数字を使う必要はありません。デフォルトでは、引数の位置は単に文字列に現れる順番です。
これを使用する適切な方法の例を示します。
String result = String.format("The format method is %s!", "great");
// result now equals "The format method is great!".
メソッドに文字列の表示方法を知らせるために、必ず%
の後に他の文字を続けて使用します。 %s
はおそらく最も一般的です、そしてそれは単に引数が文字列として扱われるべきであることを意味します。
すべてのオプションをリストするわけではありませんが、いくつか例を挙げて説明します。
// we can specify the # of decimals we want to show for a floating point:
String result = String.format("10 / 3 = %.2f", 10.0 / 3.0);
// result now equals "10 / 3 = 3.33"
// we can add commas to long numbers:
result = String.format("Today we processed %,d transactions.", 1000000);
// result now equals "Today we processed 1,000,000 transactions."
String.format
はJava.util.Formatter
を使うだけなので、オプションの詳細については Formatter javadocs を参照してください。
そして、BalusCが述べているように、必要ならばデフォルトの引数の順序を変更することが可能であることがドキュメンテーションで見られるでしょう。しかし、おそらくこれを行う必要がある、またはしたいのは、同じ引数を複数回使用している場合だけです。
ソースコードを見る代わりに、javadoc String.format() と Formatterの構文 を読んでください。
%の後に値のフォーマットを指定します。たとえば、10進整数の場合はd
、Stringの場合はs
です。
String aString = "world";
int aInt = 20;
String.format("Hello, %s on line %d", aString, aInt );
出力:
Hello, world on line 20
試したことをするには(引数インデックスを使う)、*n*$
を使います。
String.format("Line:%2$d. Value:%1$s. Result: Hello %1$s at line %2$d", aString, aInt );
出力:
Line:20. Value:world. Result: Hello world at line 20
これを使うことができます。
String.format("%1$s %2$s %2$s %3$s", "a", "b", "c");
出力:
a b b c
また、Scalaは(PredefによってもたらされたWrappedStringへの暗黙の変換を介して)いくつかのメソッドでStringを拡張しているので、以下のこともできます。
val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")
公式の参照はクラス Formatter
です。
Scala 2.10では
val name = "Ivan"
val weather = "sunny"
s"Hello $name, it's $weather today!"
これはString.format
ができることのリストです。 printf
にも同じことが言えます
int i = 123;
o.printf( "|%d|%d|%n" , i, -i ); // |123|-123|
o.printf( "|%5d|%5d|%n" , i, -i ); // | 123| –123|
o.printf( "|%-5d|%-5d|%n" , i, -i ); // |123 |-123 |
o.printf( "|%+-5d|%+-5d|%n" , i, -i ); // |+123 |-123 |
o.printf( "|%05d|%05d|%n%n", i, -i ); // |00123|-0123|
o.printf( "|%X|%x|%n", 0xabc, 0xabc ); // |ABC|abc|
o.printf( "|%04x|%#x|%n%n", 0xabc, 0xabc ); // |0abc|0xabc|
double d = 12345.678;
o.printf( "|%f|%f|%n" , d, -d ); // |12345,678000| |-12345,678000|
o.printf( "|%+f|%+f|%n" , d, -d ); // |+12345,678000| |-12345,678000|
o.printf( "|% f|% f|%n" , d, -d ); // | 12345,678000| |-12345,678000|
o.printf( "|%.2f|%.2f|%n" , d, -d ); // |12345,68| |-12345,68|
o.printf( "|%,.2f|%,.2f|%n" , d, -d ); // |12.345,68| |-12.345,68|
o.printf( "|%.2f|%(.2f|%n", d, -d ); // |12345,68| |(12345,68)|
o.printf( "|%10.2f|%10.2f|%n" , d, -d ); // | 12345,68| | –12345,68|
o.printf( "|%010.2f|%010.2f|%n",d, -d ); // |0012345,68| |-012345,68|
String s = "Monsterbacke";
o.printf( "%n|%s|%n", s ); // |Monsterbacke|
o.printf( "|%S|%n", s ); // |MONSTERBACKE|
o.printf( "|%20s|%n", s ); // | Monsterbacke|
o.printf( "|%-20s|%n", s ); // |Monsterbacke |
o.printf( "|%7s|%n", s ); // |Monsterbacke|
o.printf( "|%.7s|%n", s ); // |Monster|
o.printf( "|%20.7s|%n", s ); // | Monster|
Date t = new Date();
o.printf( "%tT%n", t ); // 11:01:39
o.printf( "%tD%n", t ); // 04/18/08
o.printf( "%1$te. %1$tb%n", t ); // 18. Apr
これは、String.format()で使用されるフォーマッタのリストです。
http://docs.Oracle.com/javase/1.5.0/docs/api/Java/util/Formatter.html
@LondoはScalaの "s"文字列インターポレーターについて言及しましたが、私はScalaの "f"文字列インターポレーター が元の質問により関連していると思います。他の応答で数回使われた例はこのように書くこともできます(Scala 2.10以降)。
scala> val name = "Ivan"
name: String = Ivan
scala> val thing = "Scala"
thing: String = Scala
scala> val formatted = f"Hello $name%s, isn't $thing%s cool?"
formatted: String = Hello Ivan, isn't Scala cool?
元の質問との関連は、次の点に注意することです。
formatted
は、先頭に "f"が付いた文字列で定義されています。これは "f"(フォーマット)文字列補間子です。Java.util.Formatter
を使いますJava.lang.String.format
は同じJava.util.Formatter
を使用します文字列補間のいいところは、String.format
メソッドの引数と一致させる代わりに、どの変数が文字列に直接代入されているのかを確認できることです。
一言で言えば、文字列Interpolationには $ があり、それによって日が節約され、私たちの生活がずっと楽になります。
例: 入力名と年齢を取り、Hello Withと名前を付けてその年齢を表す関数を定義します。それはこのように書くことができます:
def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is $age"
したがって、この関数を呼び出すと、次のようになります。
funcStringInterpolationDemo("Shivansh",22)
その出力は以下のようになります。
Hey ! my name is Shivansh and my age is 22
10年を年齢に追加したい場合のように、同じ行に変更するコードを書くことができます。
その場合、機能は次のようになります。
def funcStringInterpolationDemo(name:String,age:Int)=s"Hey ! my name is $name and my age is ${age+10}"
そして今、出力は次のようになります。
Hey ! my name is Shivansh and my age is 32