web-dev-qa-db-ja.com

ScalaでJava.String.formatを使用する方法

私は文字列の.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を使います。

319
Ivan

これまでの回答はすべて正しいのですが、すべてJavaです。これがScalaの例です。

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

Pythonの%演算子 のようにformatを作ることについてのブログ記事もあります。

301
pr1001

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

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

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.formatJava.util.Formatterを使うだけなので、オプションの詳細については Formatter javadocs を参照してください。

そして、BalusCが述べているように、必要ならばデフォルトの引数の順序を変更することが可能であることがドキュメンテーションで見られるでしょう。しかし、おそらくこれを行う必要がある、またはしたいのは、同じ引数を複数回使用している場合だけです。

298
TM.

ソースコードを見る代わりに、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
127
OscarRyz

これを使うことができます。

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

出力:

a b b c

70
Engin Ardıç

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

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

公式の参照はクラス Formatter です。

11
Alberto Segura

Scala 2.10では

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

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

これは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
3
PRO_gramista

これは、String.format()で使用されるフォーマッタのリストです。

http://docs.Oracle.com/javase/1.5.0/docs/api/Java/util/Formatter.html

2
NixRam

@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メソッドの引数と一致させる代わりに、どの変数が文字列に直接代入されているのかを確認できることです。

1
Reid Spencer

一言で言えば、文字列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
0
Shiv4nsh