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


回答:


140

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選択修飾子を使用して国際化された複数形を実行する場合は、少し優れています。変数が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) });

21
MessageFormatはローカライズを目的としているため、使用時には注意してください。たとえばMessageFormat.format("Number {0}", 1234));、デフォルトのロケールに依存する次のコードは、のNumber 1,234代わりに生成できますNumber 1234
pavel_kazlou

@ataylor:こんにちは、申し訳ありませんが、少し混乱しています。私はそのようなデータ&when {0} it ll take firstname、when {1} then lastname、を持っているClassオブジェクトを渡すようなものにしたいのですが。そのようなことは可能{0,choice,0.getFirstName()}ですか?
user3145373ツデク

@ user3145373ツ私はそうは思いません。
テイラー

わかりました。私が欲しい.Netプロジェクトを1つ参照しました。codeproject.com/ Articles / 42310 /…、このプロジェクトを参照してください。そのような利用可能なプロジェクトまたはパッケージを知っている場合は、教えてください。ありがとう
user3145373ツデク

233

String.formatを見てください。ただし、Cの関数printfファミリーと同様の書式指定子を使用することに注意してください。たとえば、次のようになります。

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

「Hello world、42」を返します。あなたは見つけることがあり、これは書式指定子について学習するときに役立ちます。Andy Thomas-Cramerは、このリンクをコメントに残しくれました。公式の仕様を示しているようです。最も一般的に使用されるものは次のとおりです。

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

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

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

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


結果を直接印刷したいだけの場合は、System.out.printf(PrintStream.printf)をお好みで見つけることができます。


2
別のオプションはjava.text.MessageFormatで、これは{1}スタイルのフォーマットシンボルを受け入れます。String.format()のフォーマットシンボルは、Cのprintf()フォーマットシンボルに似ていますが、異なる場合もあります。完全な構文については、download.oracle.com / javase / 6 / docs / api / java / util /…を参照してください。
アンディトーマス

53
String.format数値の位置をとることもできます。String.format("%2$s %1$s", "foo", "bar");出力されますbar foo
スクラムマイスター

7

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)))読みやすくします。


5
担当者を否定する場合は、その理由を説明してください。
Ryan Amos

11
1)文字列のフォーマットに関する質問に答えて、+演算子の動作を説明します。2)あなたの説明は正確でもありません。+使用するのと同じですStringBuilder、ではありませんString.concat(これに関する情報が多すぎる。)
SørenLøvborg2012

6

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

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

5
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("================================");

    }
}

アウトポット "================================
ved15space123 ved15space123 ved15space123" =========== =====================

Javaソリューション

  • 「-」は左インデントに使用されます

  • 「15」は、文字列の最小長を15にします。

  • 「s」(%の後の数文字)は、文字列で置き換えられます
  • 0は左側に0を整数に追加します
  • 3は整数を最小長の3にします


1

この解決策は私にとってうまくいきました。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」


0

私はそれが正しいことをするこの関数を書きました。$同じ名前の変数の値で始まる単語を補間します。

private static String interpol1(String x){
    Field[] ffield =  Main.class.getDeclaredFields();
    String[] test = x.split(" ") ;
    for (String v : test ) {
        for ( Field n: ffield ) {
            if(v.startsWith("$") && ( n.getName().equals(v.substring(1))  )){
                try {
                    x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
                }catch (Exception e){
                    System.out.println("");
                }
            }
        }
    }
    return x;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.