去年的时候由于工作需要,写了个用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小时内删除。
发表评论