web-dev-qa-db-ja.com

Javaで文字列をフォーマットする方法

原始的な質問、しかしどのように私はこのようにストリングをフォーマットしますか:

"{2}のステップ{1}"

javaを使用して変数を代入することによって? C#では簡単です。

157
katit

String.formatに加えて、 Java.text.MessageFormat もご覧ください。フォーマットは簡潔で、提供したC#の例に少し近いので、構文解析にも使用できます。

例えば:

int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));

より良い例は、Java 1.5の可変引数とオートボクシングの改善を利用し、上記をワンライナーに変えます。

MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");

MessageFormatは、choice修飾子を使って国際化された複数形を実行するために少し優れています。変数が1のときに単数形を正しく使用し、それ以外の場合は複数形を使用するメッセージを指定するには、次のようにします。

String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
127
ataylor

String.format を見てください。ただし、Cのprintfファミリの関数の書式指定子と似た書式指定子が必要です。たとえば、次のようになります。

String.format("Hello %s, %d", "world", 42);

「Hello world、42」を返します。フォーマット指定子について学ぶとき、 this が役に立つことがあります。 Andy Thomas-Cramerさんは、下のコメントに this linkと書いてあるが、公式の仕様を指しているようです。最も一般的に使用されているものは以下のとおりです。

  • %s - 文字列を挿入します
  • %d - 符号付き整数を挿入する(10進数)
  • %f - 実数、標準表記を挿入する

これはC#とは根本的に異なり、オプションのフォーマット指定子を使用して位置参照を使用します。 つまり、次のようなことはできません。

String.format("The {0} is repeated again: {0}", "Word");

... printf/formatに渡されたパラメータを実際に繰り返すことなく。 (下記のスクラムマイスターのコメントを参照)


結果を直接印刷したいだけであれば、System.out.printf( PrintStream.printf )を好みに合わせて見つけることができます。

206

私はそれのために私の簡単な方法を書きました:

public class SomeCommons {
    /** Message Format like 'Some String {0} / {1}' with arguments */
    public static String msgFormat(String s, Object... args) {
        return new MessageFormat(s).format(args);
    }
}

だからあなたはそれを使用することができます:

SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
6
Tomasz Modelski
public class StringFormat {

    public static void main(String[] args) {
            Scanner sc=new Scanner(System.in);
            System.out.println("================================");
            for(int i=0;i<3;i++){
                String s1=sc.next();
                int x=sc.nextInt();
                System.out.println(String.format("%-15s%03d",s1,x));
            }
            System.out.println("================================");

    }
}

outpot "=============================="
ved15space123 ved15space123 ved15space123 "===================================

Javaソリューション

  • " - "はインデントを残すために使われます

  • "15"を指定すると、Stringの最小長は15になります。

  • "s"(%の後の数文字)は、文字列に置き換えられます。
  • 0は整数を左側の0で埋めます。
  • 3は、整数を最小長の3にします。
5
Ved Prakash

String.formatを使用しないことを選択した場合、他のオプションは+二項演算子です。

String str = "Step " + a + " of " + b;

これは

new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));

どちらを使うかはあなたの選択です。 StringBuilderは高速ですが、速度の違いはわずかです。私は+演算子(StringBuilder.append(String.valueOf(X)))を実行して読みやすくする)を使用することを好みます。

3
Ryan Amos

この解決策は私のために働いた。 RESTクライアントのURLを動的に作成する必要があるので、このメソッドを作成したので、このようにrestURLを渡す必要があります。

/customer/{0}/user/{1}/order

そして、必要なだけパラメータを追加します。

public String createURL (String restURL, Object ... params) {       
    return new MessageFormat(restURL).format(params);
}

このメソッドをこのように呼び出すだけです。

createURL("/customer/{0}/user/{1}/order", 123, 321);

出力

"/ customer/123/user/321/order"

1
Felipe Bejarano