模版字符串函数-根据参数索引定位。

第一次写博文。

.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"));
	}

转载于:https://my.oschina.net/u/564462/blog/59785

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值