使用String.format()时跳过格式化程序标记的任何方法?

时间:2015-02-10 16:43:49

标签: java string-formatting string.format

我有String myString = "%d New Voicemail";

我想为2做这个:

String myString = "%d New Voicemail";
System.out.println(String.format(myString, 2));

输出:2个新语音邮件


我想为5做这个:

String myString = "%d New Voicemail";
System.out.println(String.format(myString, 5));

输出:5个新语音邮件


我想为1执行此操作:

String myString = "%d New Voicemail";
System.out.println(String.format(myString));

输出:CRASH

预期输出:新语音邮件


正如您所看到的,对于" 1"我只想显示没有格式化的字符串。如果我只是遗漏了额外的参数,它会崩溃。有一个我不知道的简单解决方案吗?

我可以这样做,但想知道这是否更简单:

int num;
if (num == 1){
    System.out.println(myString.subString(3));

} else {
    System.out.println(String.format(myString, num));

}

4 个答案:

答案 0 :(得分:1)

尝试

System.out.printf("%s New Voicemail%n", num == 1 ? "" : num);

答案 1 :(得分:1)

这当然是极端的技巧。但是,一旦设置,它使用起来很简单,设计团队没有任何理由抱怨。

static String voicemail( int n ){
    MessageFormat form = new MessageFormat("{0}");
    double[] filelimits = {0,1,2};
    String[] filepart = {"No New Voicemail",
             "New Voicemail",
             "{0,number} New Voicemails"};
    ChoiceFormat fileform = new ChoiceFormat(filelimits, filepart);
    form.setFormatByArgumentIndex(0, fileform);
    Integer[] values = new Integer[]{n};
    return form.format( values );
}

测试:

for( int i = 0; i <=3; ++i ){
    System.out.println( voicemail(i) );
}

输出

No New Voicemail
New Voicemail
2 New Voicemails
3 New Voicemails

答案 2 :(得分:0)

虽然传递给printf的参数少于格式行所期望的参数是不行的,但传递更多参数是可以的。您可以对格式行本身使用条件表达式,如下所示:

System.out.printf(num != 1 ? myString : myString.substring(3), num);

Demo.

答案 3 :(得分:0)

由于您希望使用两条不同的指令来打印1或> 1条语音邮件,因此很明显您必须在您的程序中某处if 。这就是你可以改变格式的地方。

String format = "New Voicemail";
if (num == 1){
  System.out.println(myString);
} else {
  System.out.println(String.format("%d " + format, 5));
}