Scalaでjava.String.formatを使用するには?


322

.format文字列のメソッドを使用しようとしています。ただし、%1、%2などを文字列に配置すると、java.util.UnknownFormatConversionExceptionがスローされ、混乱を招くJavaソースコードの一部が示されます。

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));
    }
}

これから私は%イワナが禁じられていることを理解しています。その場合、引数のプレースホルダーには何を使用すればよいですか?

私はScala 2.8 を使用しています。

回答:


302

以前のすべての応答は正しいですが、それらはすべてJavaで記述されています。以下はScalaの例です。

val placeholder = "Hello %s, isn't %s cool?"
val formatted = placeholder.format("Ivan", "Scala")

私はまた、約ブログの記事持って作るformatPythonのように%オペレータに便利かもしれません。


2
JDKドキュメントの例がたくさん:docs.oracle.com/javase/7/docs/api/java/util/...
angelcervera

1
あなたは適用することにより、簡素化することができformat、文字列リテラルに直接:"Hello %s, isn't %s cool?".format("Ivan", "Scala")
sotrh

298

位置を示すために数字を使用する必要はありません。デフォルトでは、引数の位置は、単に文字列に現れる順序です。

これを使用する適切な方法の例を次に示します。

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ので、オプションの詳細については、フォーマッタのjavadocsを参照してください。

そして、BalusCが言及するように、必要に応じてデフォルトの引数の順序を変更することが可能なドキュメントを見るでしょう。ただし、同じ引数を2回以上使用している場合は、おそらくこれを実行する必要があるだけです。


127

ソースコードを見る代わりに、javadoc String.format()Formatter syntaxを読んでください。

%の後に値の形式を指定します。たとえば、10進整数の場合はd、文字列の場合は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

70

これを使用できます。

String.format("%1$s %2$s %2$s %3$s", "a", "b", "c");

出力:

abbc


1
私はこの種の使用法を見たことがありません、それは素晴らしい文字列を繰り返すときに非常に便利です!
Domi.Zhang 2013年

8
+1これは、C#開発者として使用しているものに似ています。そこでは、{0}andの{1}代わりに%1$and を使用します%2$
ashes999 2013年

@ ashes999私はc#ランド出身です。私は番号付き括弧に慣れているので、標準的な方法ではないことを忘れていました。パーセント記号を見ると、すべてが元に戻ります。
JonnyRaa

13

また、ScalaはStringをいくつかのメソッドで拡張していることにも注意してください(PredefによってもたらされたWrappedStringへの暗黙的な変換を介して)。したがって、次のことも実行できます。

val formattedString = "Hello %s, isn't %s cool?".format("Ivan", "Scala")


10

Scala 2.10では

val name = "Ivan"
val weather = "sunny"

s"Hello $name, it's $weather today!"

1
これは単なる文字列連結の特別な構文であると解釈します(つまり、$ nameと$ weatherは以前に定義された変数へのハード参照です)。ただし、String.Formatはテンプレートをパラメーターとして受け取るため、たとえば、プロパティファイルなどからテンプレートを取得することができます。-上記の構文でそれは可能ですか?
チッコドロ2013

それは呼び出し文字列補間です。スカラ内にはs ""とf ""の2つのタイプがあります。's 'は単純な文字列で、' f 'はに似ていprintfます。試す)。$nameそれは変数の値に置き換えする必要があることを意味nameしますが、例えば、補間動作を行うことができ、s"Hello ${name.toUpperCase}, it's $weather today!"
ロンド

3

これは何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


1

@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"(フォーマット)文字列補間です。
  • "f"文字列補間は、 java.util.Formatter
  • java.lang.String.format 同じを使用します java.util.Formatter

文字列補間の良い点は、String.formatメソッドの引数と一致させる必要がなく、文字列に直接代入されている変数を確認できることです。


0

scalaでは、文字列補間のために、1日を節約して私たちの生活を非常に簡単にする$があります。

例:名前と年齢を入力して、「Hello With the name」と「age」と言う関数を定義するとします。それは次のように書くことができます:

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.