按指定长度截取字符串,考虑全角半角

关于用Java来截取指定长度的字符串,我在网上看到很多帖子和方法,大都是说用substring(),但是如果考虑到全角半角的话,这是怎么也达不到期望值的。因为之前自己也用到过,所以把自己整理好的一些东西拿出来,希望能和大家分享下。如果还有更好更简洁的方法,望大侠们指点一二。

注:所有测试都是基于该值已通过必须输入的检查。
1.subByStrLenth() 在不考虑全角的情况下,即假定该字符串都是半角的。
2.subByFullWidth() 如果已确保该值都是由全角字符,即字符都是全角且指定长度是大于0的偶数的情况下。
3.subByStrByte() 考虑全角半角的截取,且舍掉半个汉字后,长度不足的情况下是否要在右边补空格。
// 按指定的长度来截取字符串,不管全角半角,一个字符一个长度。
public static String subByStrLength(String value, int length) {

	return value.length() > length ? new String(value.substring(0, length)) : value;
}

// 按指定的长度来截取字符串,前提是字符串是全角的,指定长度是大于0的偶数。
public static String subByFullWidth(String value, int length) {

	return value.getBytes().length > length ? new String(value.getBytes(), 0, length) : value;
}

// 按指定的长度下,考虑字符的全角半角,且当舍掉最后半个汉字后,长度不足的情况下是否要在右边补空格。
public static String subByStrByte(String value, int length, boolean paddingSpace) {

	String valueTemp = "";

	// 指定的长度下,考虑字符的全角半角,最后的汉字。
	if (value.getBytes().length > length) {
		for (char c : value.toCharArray()) {
			if (valueTemp.getBytes().length <= length) {
				valueTemp += c;

				if (valueTemp.getBytes().length == length) {
					break;

				} else if (valueTemp.getBytes().length > length) {
					char[] charTemp = valueTemp.toCharArray();
					valueTemp = "";

					for (int i = 0; i < charTemp.length - 1; i++) {
						valueTemp += charTemp[i];
					}

					break;
				}
			}
		}
	}

	// 指定的长度下,长度不足的情况是否要在右边补空格。

	if (paddingSpace) {
		StringBuffer valueBuffer = new StringBuffer(valueTemp);
		for (int i = 0; i < length - valueTemp.getBytes().length; i++) {
			valueBuffer.append(" ");
		}

		return valueBuffer.toString();
	}

	return valueTemp;
}

// 字符串的截取测试
public static void main(String[] args) {

	String str1 = "字符串的截取";
	String str2 = "字符串的截取test";

	System.out.println(subByStrByte(str2, 7, true));
	System.out.println(subByStrByte(str2, 7, false));

	System.out.println(subByStrLength(str2, 7));
	System.out.println(subByFullWidth(str1, 6));
}

第一个输出结果是带空格的字符串“字符串 ”。
运行结果:
字符串 
字符串
字符串的截取t
字符串
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值