本帖最后由 16463535 于 2013-4-18 13:05 编辑
编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”.
public static void main(String[] args)
{
;// TODO Auto-generated method stub
String str = "我ABC汉DEF民JQK"; //定义一个需要截取的字符串
String strOk = mySubString(str,6);//定义一个接收mySubString()返回值的字符串
System.out.println(strOk);
}
public static String mySubString(String str,int subByte) //为了调用方便方法暂时定义为静态的。
{ //String str:需要截取的字符串,int subByte:要截取的字节数
if(str.equals("")) //判断字符串是否为"",如果为"",方法毫无意义,直接返回
{
return "请输入您要截取的原字符串";
}
if(str.length()<2) //判断字符串长度是否过小,容易效果不明显。或者字节数超出原字符串长度导致原字符串输出。
{
System.out.println("友情提示:输入的符串长度过短,本程序继续运行,如果效果不明显,调整参数后再运行");
}
if(subByte<2) //判断字节数是否过小,容易出现字符串第一位为汉字时,没有运行结果。
{
System.out.println("友情提示:输入的字节数过少,本程序继续运行,很容易出现没有效果的情况,希望调整参数后再运行");
}
StringBuilder sb = new StringBuilder();//创建字符串缓冲区
int strbytes = 0; //创建一个记录新字符串字节总数的变量
String strSub = null; //创建一个记录原字符串中单个字符的变量
for(int x=0; x<str.length(); x++) //判断和赋值的次数不确定所以用循环
{
strSub = str.substring(x,x+1); //顺序取出原字符串一个字符
int strByte = 0; //定义一个记录原字符串单个字符的字节数的变量。记录一次使用后,即可归零。所以定义在这里。
strByte = strSub.getBytes().length;//获取单个字符占用的字节数,用strByte记录。
strbytes = strbytes+strByte; //将新字符串的字节数相加,用于以下判断
if(strbytes==subByte) //判断累加的字节数是否与要截取的字节数相等
{
sb.append(strSub); //如果相等,将strSub追加到StringBuilder中
return sb.toString(); //将 StringBuilder 进行 toString()返回
}
if(strbytes<subByte) //判断累加的字节数是否小于subByte
{
sb.append(strSub); //如果小于,继续将strSub追加到StringBuilder中
}
if(strbytes>subByte) //判断累加的字节数是否超过了指定要截取的字节数
{
return sb.toString(); //如果超过了,那么直接将现有的 StringBuilder 进行 toString()返回
//因为当strbytes==subByte的时候,正是需要截取的字节数,
//如果strbytes>subByte时,那么最后要追加的这个字符一定占用了1个以上的字节,才导致strbytes>subByte
//本题只涉及到了字母和中文,按照本题的要求,绝对不能截取出中文的一半
}
}
//当输入的字节数大于了原字符串字节数的总和时,for(int x=0; x<str.length(); x++)将在str.length()后停下,StringBuilder中还是原字符串。
return "您输入的字节数大于原字符串字节数的总和,将原字符串输出如下\r\n"+sb.toString();
}
}
求高手指点,这样做是否妥当? |