Java 不忽略额外参数的更严格的String.format?
Java的Java 不忽略额外参数的更严格的String.format?,java,string,string-formatting,Java,String,String Formatting,Java的String.format自动忽略传递的额外参数,这些参数在格式字符串中未使用,但如果传递的参数较少或无效,则会失败。当传递更多参数时,有没有办法处理这种情况 如果参数多于格式说明符,则会忽略额外的参数 在不计算或分析%的情况下采用不同的方法。但这不是一个有效的方法 public static String safeFormat(String formatStr, Object... args) { List<Object> objects = Arrays.as
String.format
自动忽略传递的额外参数,这些参数在格式字符串中未使用,但如果传递的参数较少或无效,则会失败。当传递更多参数时,有没有办法处理这种情况
如果参数多于格式说明符,则会忽略额外的参数
在不计算或分析
%
的情况下采用不同的方法。但这不是一个有效的方法
public static String safeFormat(String formatStr, Object... args) {
List<Object> objects = Arrays.asList(args);
// https://commons.apache.org/proper/commons-lang/javadocs/api-3.7/org/apache/commons/lang3/mutable/MutableBoolean.html
MutableBoolean isCalled = new MutableBoolean(false);
objects.add(new Object(){
@Override
public String toString() {
isCalled.setTrue();
return "";
}
});
//noinspection ResultOfMethodCallIgnored
String.format(formatStr+" %s", objects.toArray());
if(isCalled.isFalse()) {
throw new IllegalArgumentException("Not all arguments used by formatter");
}
return String.format(formatStr, args);
}
publicstaticstringsafeformat(stringformatstr,Object…args){
List objects=Arrays.asList(args);
// https://commons.apache.org/proper/commons-lang/javadocs/api-3.7/org/apache/commons/lang3/mutable/MutableBoolean.html
MutableBoolean isCalled=新的MutableBoolean(false);
添加(新对象(){
@凌驾
公共字符串toString(){
isCalled.setTrue();
返回“”;
}
});
//无检查结果方法Callignored
format(formatStr+%s),objects.toArray();
if(isCalled.isFalse()){
抛出新的IllegalArgumentException(“并非格式化程序使用的所有参数”);
}
返回String.format(formatStr,args);
}
你能告诉我们你想处理哪种情况吗?@YCF\u L添加了示例你想对额外的参数做什么?你可以简单地计算以%、exclude%%开头的子字符串的实例,并检查结果数字是否与参数的长度匹配。这不是一个简单的问题。考虑这一点:<代码> String。格式化(“% 1美元%s 1美元S”,1, 2)< /代码>。是否因为2
未使用而失败?关于String.format(“%2$s”,1,2)
?
public static String safeFormat(String formatStr, Object... args) {
List<Object> objects = Arrays.asList(args);
// https://commons.apache.org/proper/commons-lang/javadocs/api-3.7/org/apache/commons/lang3/mutable/MutableBoolean.html
MutableBoolean isCalled = new MutableBoolean(false);
objects.add(new Object(){
@Override
public String toString() {
isCalled.setTrue();
return "";
}
});
//noinspection ResultOfMethodCallIgnored
String.format(formatStr+" %s", objects.toArray());
if(isCalled.isFalse()) {
throw new IllegalArgumentException("Not all arguments used by formatter");
}
return String.format(formatStr, args);
}