去年的时候由于工作需要,写了个用C#截取指定长度的方法,当时颇费了一番周折,因为想错了方向。
例如要截取字符串"我是1个中国人",取3位长度,那得到的结果是"我",如果取6位长度,得到的结果是"我是1",因为汉字是两个字节。
当时的思路主要是考虑最后一位是单字节还是双字节,不过最终得出了比较不错的方法,只是这方法后来却不到了,重新写一个又太懒,想或许到Google上能搜索到,但是可惜的是,搜索到的方法几乎都有问题,不单是效率,还有结果都不能正常显示,有的文章甚至被不少大网站互相转来转去,呀,没有人调试过吗?
拿出时间来自己写一个,大家看代码:
public static string GetSubString(string str, int length)
    {
        string temp = str;
        int j = 0;
        int k = 0;
        for (int i = 0; i < temp.Length; i++)
        {
            if (Regex.IsMatch(temp.Substring(i, 1), @"[\u4e00-\u9fa5]+"))
          {
                j += 2;
            }
            else
            {
                j += 1;
            }
            if (j <= length)
            {
                k += 1;
            }
            if (j >= length)
            {
                return temp.Substring(0, k);
            }
        }
        return temp;
    }
具体思路是,定义两个变量:j 与K,例如要截取字符串"我是1个中国人",取3位长度,从第一个字符开始判断——temp.Substring(i, 1),如果是双字节j+2,否则加1,而变量K则每次循环加1,用来执行最后的截取操作。
当j <= 要截取的字节数,变量K停止加1。
当j >= 要截取的字节数,根据K返回截取后的结果。
看到别人的方法,都是最先将整个字符串中的中文替换成双字节,然后判断总长度是否大于需要截取的长度,如果大于再执行截取,而这样无疑是低效的(如果需要截取的字符串有1万个字符,需要返回的是20个字符,同时返回20条记录的话需要替换几十万次....),还要接下来再判断是该截取几位.....
/**工作需要,要一段截取定长混合的代码。*/
public static string GetSubString(string str, int length) {
string temp = str;
int j = 0, k=0;
CharEnumerator ce = str.GetEnumerator();
while (ce.MoveNext()) {
j += (ce.Current > 0 && ce.Current < 255) ? 1 : 2 ;
if (j <= length) {
k++;
} else {
temp = str.Substring(0, k);
break;
}
}
return temp;
}
你这个有问题,只能判断中文,应该判断所有双字节字符
public static string GetStrLenAll(string s, int len, string style)
{
string temp = s;
if (Regex.Replace(temp, "[^\x00-\xff]", "zz", RegexOptions.IgnoreCase).Length <= len)
{
return temp;
}
for (int i = temp.Length; i >= 0; i--)
{
temp = temp.Substring(0, i);
if (Regex.Replace(temp, "[^\x00-\xff]", "zz", RegexOptions.IgnoreCase).Length <= len - style.Length)
{
return temp + style;
}
}
return "";
}

C#截取字符串应用:用C#截取指定长度的中英文混合字符串
我们常做的一件事情,就是在文章系统中,截取一定长度的文章标题,超过指定长度,就加“...”
如两个字符串:
1.string str1 = "中国人要啊abc呀~"
2.string str2 = "1中国人23456abc呀~"
C#截取字符串程序输出:
1.str1 = "中国人要..."
2.str2 = "1中国人2..."
即要把中英文混合的字符串,在截取后,长度要一致,即8个字节的长度(不包括三个点),而
且不能出现中文被从中间截断的情况。于是写了个方法:
1.public static string getStr(string s,int l) 
2.
3.string temp = s ; 
字符串长度的判断
4.if (Regex.Replace(temp, 
5."[\u4e00-\u9fa5]","zz"
6.RegexOptions.IgnoreCase).Length<=l) 
7.
8.return temp; 
9.
10.for (int i=temp.Length;i>=0;i--) 
11.
12.temp = temp.Substring(0,i); 
13.if (Regex.Replace(temp, 
14."[\u4e00-\u9fa5]","zz"
15.RegexOptions.IgnoreCase).Length<=l-3) 
16.
17.return temp + ""
18.
19.
20.return ""
21.
调用:
1.string content = "中国人啊abc呀呀呀呀"
2.content = getStr(content,13); 
C#截取字符串的相关应用就向你介绍到这里,希望对你了解和学习C#截取字符串的操作有所帮助。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。