C#实现与新浪微博相同算法的字数统计函数,要的拿走。

微博剩余字数统计新浪官方算法的C#实现,要的朋友请保存。

参数text是正文内容。

isOutOfRange用来判断文字是否溢出,以此来控制发送按钮的可用状态。

 1 public static string GetContentLengthString(string text, out bool isOutOfRange)
 2 {
 3     text = text.Trim();
 4     text = Regex.Replace(text, "\r\n", "\n");
 5     int textLength = 0;
 6     if (text.Length > 0)
 7     {
 8         int min = 41, max = 140, urlLen = 20;
 9         var n = text;
10         var r = Regex.Matches(text, @"http://[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+([-A-Z0-9a-z_$.+!*()/\\\,:;@&=?~#%]*)*");
11         var total = 0;
12         for (int m = 0, p = r.Count; m < p; m++)
13         {
14             var url = r[m].Value;
15             var byteLen = url.Length + Regex.Matches(url, @"[^\x00-\x80]").Count;
16             if (Regex.IsMatch(url, @"^(http://t.cn)"))
17             {
18                 continue;
19             }
20             else if (Regex.IsMatch(url, @"^(http:\/\/)+(weibo.com|weibo.cn)"))
21             {
22                 total += byteLen <= min ? byteLen : (byteLen <= max ? urlLen : (byteLen - max + urlLen));
23             }
24             else
25             {
26                 total += byteLen <= max ? urlLen : (byteLen - max + urlLen);
27             }
28             n = n.Replace(url, "");
29         }
30         textLength = (int)Math.Ceiling((total + n.Length + Regex.Matches(n, @"[^\x00-\x80]").Count) / 2.00d);
31     }
32 
33     int textRemainLength = 140 - textLength;
34     string template = string.Empty;
35     if (textRemainLength >= 0)
36     {
37         template = "还可以输入{0:N0}个字";
38         isOutOfRange = false;
39     }
40     else
41     {
42         template = "已经超过了{0:N0}个字";
43 
44         isOutOfRange = true;
45     }
46     return string.Format(template, Math.Abs(textRemainLength));
47 }

执行效果

posted @ 2012-08-02 23:42  林选臣  阅读(1663)  评论(3编辑  收藏  举报