第一次写博文。
.Net中String.Format有个比较方便的方法就是根据参数索引定位。
以下是我在java中的一个实现,欢迎指正:
public class Strings {
/**
* 根据模版字符串生成目标字符串。
* 如: Strings.format("Hi, {0}, {1}", "there", "How do you do"));
* 将生成:"Hi, there, How do you do"
* 使用反义符: \\,忽略'{'符号
* @param template 模版字符串,使用从0开始的索引定位参数。如:{0}, {1}等。 注意:索引可反复使用。
* @param args 参数
* @return 目标字符串。
*/
public static String format(String template, Object... args) {
if(args == null || args.length == 0) {
throw new IllegalArgumentException("Invalid Arguments.");
}
StringBuilder result = new StringBuilder();
for(int i = 0, k = 0; i < template.length(); i++) {
char ch = template.charAt(i);
// 如果是反义符
if(ch == '\\') {
result.append(template.substring(k, i));
k = i + 1;
i++;
continue;
}
if(ch == '{') {
int num = 0;
int j = i;
while((ch = template.charAt(++i)) != '}') {
if(ch < '0' || ch > '9') {
throw new IllegalArgumentException("模版字符串在位置[" + i + "]上错误的符号:" + ch);
}
num = num * 10 + (ch - '0');
}
if(num > args.length) {
throw new IllegalArgumentException("模版字符串在位置[" + (j + 1) + "]上错误的符号:" + template.substring(j + 1, i) + ", 超出参数索引");
}
result.append(template.substring(k, j)).append(args[num]);
k = i + 1;
}
}
return result.toString();
}
}
以下是测试:
// 普通测试
public static void main(String[] args) {
System.out.println(
Strings.format("Hi, {0}, {1}", "there", "How do you do"));
System.out.println(
Strings.format("hi, {0}. are you {0}", "Jevon"));
try {
System.out.println(
Strings.format("{a}, {0}", "hille", "fdafd"));
} catch(IllegalArgumentException e) {
System.out.println(e.getMessage());
}
try {
System.out.println(
Strings.format("{0}, {11}", "hille", "fdafd"));
} catch(IllegalArgumentException e) {
System.out.println(e.getMessage());
}
System.out.println(
Strings.format("\\{0\\}={0}", "yes"));
System.out.println(
Strings.format("\\{0}={0}, \\{1}={1}", "yes", "no"));
}