天天看点

按照指定显示长度分割字符串

这两天工作过程中处理TextView显示文字的时候遇到一个需求,需要把字符串切割成等长的几段,按照指定长度,多余的换行显示,于是做了以下小算法,写下以记之!

/**
	 * 处理输入的字符串,将字符串分割成以byteLength为宽度的多行字符串。
	 * 根据需要,英文字符的空格长度为0.5,汉字的长度为2(GBK编码下,UTF-8下为3),数字英文字母宽度为1.05。
	 * @param inputString 输入字符串
	 * @param byteLength 以byteLength的长度进行分割(一行显示多宽)
	 * @return 处理过的字符串
	 */
	public static String getChangedString(String inputString, int byteLength) {
		char[] chars = inputString.toCharArray();
		char[] workChars = new char[chars.length * 2];

		// i为工作数组的角标,length为工作过程中长度,stringLength为字符实际长度,j为输入字符角标
		int i = 0, stringLength = 0;
		float  length = 0;
		for (int j = 0; j < chars.length; i++, j++) {

			// 如果源字符串中有换行符,此处要将工作过程中计算的长度清零
			if (chars[j] == '\n') {
				length = 0;
			}
			try {
				workChars[i] = chars[j];
				//对汉字字符进行处理
				if (new Character(chars[j]).toString().getBytes("GBK").length == 2 /*&& chars[j] != '”' && chars[j] != '“'*/) {
					length++;
					if (length >= byteLength) {
						if (chars[j + 1] != '\n') {
							i++;
							stringLength++;
							workChars[i] = '\n';
						}
							length = 0;
					}
				} else if (new Character(chars[j]).toString().getBytes("GBK").length == 1) {
					//对空格何应为字符和数字进行处理。
					if (chars[j] == ' ' ) {
						length -= 0.5;
					}else {
						length += 0.05;
					}
				}
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			stringLength++;
			length++;
			//长度超过给定的长度,插入\n
			if (length >= byteLength) {
				if (chars[j + 1] != '\n') {
					i++;
					stringLength++;
					workChars[i] = '\n';
				}
				length = 0;
			}
		}
		String outputString = new String(workChars).substring(0, stringLength)/* .trim() */;
		System.out.println(outputString);
		return outputString;
	}
           

以下是测试代码和测试结果:

public static void main(String[] args) {
		// TODO Auto-generated method stub
		String string = 
				  "        盼望着,盼望着,东风来了,春天的脚步近了。\n"
				+ "        一 切都像刚睡醒的样子,欣欣然张开了眼。山朗润起来了,水涨起来了,太阳的脸红起来了。\n"
				+ "        小草偷偷地从土里钻出来,嫩嫩的,绿绿的。园子里,田野里,瞧去,一大片一大片满是的。坐着,躺着,打两个滚,踢几脚球,赛几趟跑,捉几回迷藏。风轻悄悄的,草软绵绵的。\n"
				+ "桃树、杏树、梨树,你不让我,我不让你,都开满了花赶趟儿。红的像火,粉的像霞,白的像雪。花里带着甜味儿;闭了眼,树上仿佛已经满是桃儿、杏儿、梨儿。花下成千成百的蜜蜂嗡嗡地闹着"
				+ ",大小的蝴蝶飞来飞去。野花遍地是:杂样儿,有名字的,没名字的,散在草丛里,像眼睛,像星星,还眨呀眨的。\n"
				+  "    “吹面不寒杨柳风”,不错的,像母亲的手抚摸着你。风里带来些新翻的泥土的气息,混着青草味儿,还有各种花的香,"
				+ "都在微微润湿的空气里酝酿。鸟儿将巢安在繁花嫩叶当中,高兴起来了,呼朋引伴地卖弄清脆的喉咙,唱出宛转的曲子,跟轻风流水应和着。牛背上牧童的短笛,这时候也成天嘹亮地响着。\n"
				+ "        雨是最寻常的,一下就是三两天。可别恼。看,像牛毛,像花针,像细丝,密密地斜织着,人家屋顶上全笼着一层薄烟。树叶儿却绿得发亮,小草儿也青得逼你的眼。傍晚时候,上灯了,一点点黄晕的光,烘托出一片安静而和平的夜。在乡下,小路上,石桥边,有撑起伞慢慢走着的人,地里还有工作的农民,披着蓑戴着笠。他们的房屋,稀稀疏疏的,在雨里静默着。\n"
				+ "        天上风筝渐渐多了,地上孩子也多了。城里乡下,家家户户,老老小小,也赶趟儿似的,一个个都出来了。舒活舒活筋骨,抖擞抖擞精神,各做各的一份事去。“一年之计在于春”,刚起头儿,有的是工夫,有的是希望。\n\n"
				+ "        春天像刚落地的娃娃,从头到脚都是新的,它生长着。\n"
				+ "        春天像小姑娘,花枝招展的,笑着,走着。\n"
				+ "        春天像健壮的青年,有铁一般的胳膊和腰脚,领着我们上前去。\n";
		getChangedString(string, 60);
	}
           

测试结果:

按照指定显示长度分割字符串

继续阅读