在Java上,我知道接下来的事情还可以:
String test="aaa";
System.out.println(String.format(test,"asd"));
(打印“aaa”)
但是,我希望能够处理相反的事情,例如:
String test="aaa%sbbb";
System.out.println(String.format(test));
(这会产生异常java.util.MissingFormatArgumentException)
我希望尽可能地使它成为一般,无论有多少个说明符/参数,如果没有足够的值,只需忽略它们(从问题位置跳过所有说明符)并写下其余的字符串(例如,在我显示的情况下,它会写“aaabbb”)。
是否可以开箱即用,或者我应该编写一个功能吗?
答案 0 :(得分:1)
public static String formatString(final String stringToFormat,final Object... args)
{
if(stringToFormat==null||stringToFormat.length()==0)
return stringToFormat;
int specifiersCount=0;
final int argsCount=args==null ? 0 : args.length;
final StringBuilder sb=new StringBuilder(stringToFormat.length());
for(int i=0;i<stringToFormat.length();++i)
{
char c=stringToFormat.charAt(i);
if(c!='%')
sb.append(c);
else
{
final char nextChar=stringToFormat.charAt(i+1);
if(nextChar=='%'||nextChar=='n')
{
++i;
sb.append(c);
sb.append(nextChar);
continue;
}
// found a specifier
++specifiersCount;
if(specifiersCount<=argsCount)
sb.append(c);
else while(true)
{
++i;
c=stringToFormat.charAt(i);
// find the end of the converter, to ignore it all
if(c=='t'||c=='T')
{
// time prefix and then a character, so skip it
++i;
break;
}
if(c>='a'&&c<='z'||c>='A'&&c<='Z')
break;
}
}
}
return String.format(sb.toString(),args);
}
和测试,只是为了表明它有效:
System.out.println(formatString("aaa%sbbb"));
System.out.println(formatString("%da%sb%fc%tBd%-15se%16sf%10.2fg"));
遗憾的是,它会在途中创建一个新的stringBuilder和一个字符串,但它可以工作。
答案 1 :(得分:0)
是否可以开箱即用,或者我应该编写一个功能吗?
开箱即用是不可能的。标准实现中没有任何内容可以忽略它。
我猜你可以编写一个处理格式字符串的函数来摆脱“不需要的”格式说明符。但它很可能更容易:
format
方法一次,或