使用 String.format() 时有什么方法可以跳过格式化程序标记?
Any way to skip a formatter token when using 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));
输出:崩溃
预期输出:新语音邮件
如您所见,对于“1”,我只想显示没有格式化的字符串。如果我只是遗漏了额外的参数,它就会崩溃。有没有我不知道的简单解决方案?
我可以这样做,但想知道是否有更简单的方法:
int num;
if (num == 1){
System.out.println(myString.subString(3));
} else {
System.out.println(String.format(myString, num));
}
尝试
System.out.printf("%s New Voicemail%n", num == 1 ? "" : num);
虽然向 printf
传递的参数少于格式行预期的数量是不可行的,但传递更多参数是可以的。您可以为格式行本身使用条件表达式,如下所示:
System.out.printf(num != 1 ? myString : myString.substring(3), num);
由于您想要使用两个不同的指令来打印 1 或 >1 语音邮件,很明显您必须有一个if
在你程序的某处。这是您可以更改格式的地方。
String format = "New Voicemail";
if (num == 1){
System.out.println(myString);
} else {
System.out.println(String.format("%d " + format, 5));
}
这当然是极致的技巧。但是,一旦设置好,使用起来很简单,设计团队也没有任何抱怨的理由。
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
我有一个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));
输出:崩溃
预期输出:新语音邮件
如您所见,对于“1”,我只想显示没有格式化的字符串。如果我只是遗漏了额外的参数,它就会崩溃。有没有我不知道的简单解决方案?
我可以这样做,但想知道是否有更简单的方法:
int num;
if (num == 1){
System.out.println(myString.subString(3));
} else {
System.out.println(String.format(myString, num));
}
尝试
System.out.printf("%s New Voicemail%n", num == 1 ? "" : num);
虽然向 printf
传递的参数少于格式行预期的数量是不可行的,但传递更多参数是可以的。您可以为格式行本身使用条件表达式,如下所示:
System.out.printf(num != 1 ? myString : myString.substring(3), num);
由于您想要使用两个不同的指令来打印 1 或 >1 语音邮件,很明显您必须有一个if
在你程序的某处。这是您可以更改格式的地方。
String format = "New Voicemail";
if (num == 1){
System.out.println(myString);
} else {
System.out.println(String.format("%d " + format, 5));
}
这当然是极致的技巧。但是,一旦设置好,使用起来很简单,设计团队也没有任何抱怨的理由。
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