牛骨文教育服务平台(让学习变的简单)
博文笔记

Java区分中英文截取字符串

创建时间:2016-10-08 投稿人: 浏览次数:1045
/**
 * 
 */
package org.noe.biz.tps.wrc;

import org.apache.commons.lang3.StringUtils;

/**
 * 区分中英文截取字符串
 * 
 * @author 
 * @company 
 * @version 1.0
 */
public class SubString {
	/**
	 * 字符串编码格式
	 */
	public static final String ENCODE = "UTF-8";
	
	/**
	 * 判断一个字符是Ascill字符还是其它字符(如汉,日,韩文字符)
	 * 
	 * @param c
	 * @return boolean
	 */
	public static boolean isLetter(char c) {
		int k = 0x80;
		return (c / k) == 0 ? true : false;
	}

	/**
	 * 得到一个字符串的长度,显示的长度,一个汉字或日韩文长度为1,英文字符长度为0.5
	 * 
	 * @param 
	 *      s 需要得到长度的字符串
	 * @return 
	 * 		得到的字符串长度
	 */
	public static double length(String s) {
		if (s == null) {
			return 0;
		}
		char[] c = s.toCharArray();
		double len = 0;
		for (int i = 0; i < c.length; i++) {
			if (isLetter(c[i])) {
				len += 0.5;
			} else {
				len += 1;
			}
		}
		return Math.ceil(len);
	}

	/**
	 * 截取一段字符的长度,不区分中英文,如果数字不正好,则少取一个字符位
	 * 
	 * @param origin
	 *     		原始字符串
	 * @param len
	 *         	截取长度(一个汉字长度按1算的)
	 * @return String, 返回的字符串
	 */
	public static String getSubString(String origin, int len) {
		try {
			// 字符串为空
			if (StringUtils.isBlank(origin) || (len < 1)) {
				return "";
			}
			// 截取长度大于字符串长度
			if (len > length(origin)) {
				return origin;
			}
			
			StringBuffer buffer = new StringBuffer();
			char[] array = origin.toCharArray();
			double currentLength = 0;  
			for(char c : array){
				// 字符长度
				int charlen = String.valueOf(c).getBytes(ENCODE).length;
				// 汉字按一个长度,字母数字按半个长度
				if(charlen == 3){
					currentLength += 1;
				}else {
					currentLength += 0.5;
				}
				if(currentLength <= len){
					buffer.append(c);
				} else {
					break;
				}
			}
			buffer.append("...");
			
			return buffer.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		return null;
	}
	
	/**
	 * 测试
	 * @param args
	 */
	public static void main(String[] args) {
		System.out.println(getSubString("asd阿桑福德斯蒂芬森的。。!!", 7));
	}
}

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。