获取字符串在AS400中存储的实际长度
由于as400中存储中文字符时带有前导符和后导符,c#中获取字符串长度并非字符串在400种实际存储长度,
故作了以下方法,代码如下:
- #region 获取字符串在400中存储实际占用的长度
- /**//// <summary>
- /// 获取字符串在400中存储实际占用的长度
- /// creator: zhengjx
- /// </summary>
- /// <param name="strInput"></param>
- /// <returns></returns>
- public static int LengthOfAS400String(string strInput)
- {
- /**////400中文字符规则:中文字符串前面应该有前导符,后面紧跟后导符
- ///所以总长度应该 = strInput.Length + 中文字符数 + 中文字符串数*2
- int rtnLength = strInput.Length;
- Regex regex = new Regex(@"[u0100-uffff]+");
- MatchCollection matches = regex.Matches(strInput);
- for( int i = 0; i != matches.Count; ++i )
- {
- rtnLength += matches[i].Value.ToString().Trim().Length + 2;
- }
- return rtnLength;
- 另外一种方法:遍历字符串来判断(注释)#region 另外一种方法:遍历字符串来判断(注释)
- // int rtnLength = 0;
- // if (HasChinese(strInput))
- // {
- // char[] cArr = strInput.ToCharArray();
- // bool isNextCharChinese = false;
- //
- // for(int i = 0; i<cArr.Length ; i++)
- // {
- // if ( i== cArr.Length - 1)
- // {
- // //最后一个字符如果是中文,应该+3 (中文2个字符+一个后导符)
- // if (HasChinese(cArr[i].ToString().Trim()))
- // {
- // rtnLength += 3;
- // //第一个字符如果是中文,应该多加一个前导符
- // if ( i == 0)
- // {
- // rtnLength += 1;
- // }
- // }
- // else
- // {
- // rtnLength += 1;
- // }
- // continue;
- // }
- //
- // isNextCharChinese = HasChinese(cArr[i+1].ToString().Trim());
- //
- // if (HasChinese(cArr[i].ToString().Trim()))
- // {
- // //第一个字符如果是中文,应该多加一个前导符
- // if ( i == 0)
- // {
- // rtnLength += 1;
- // }
- // rtnLength += 2;
- // //如果当前字符是中文,且下一个字符是英文,则应多加一个后导符
- // if (!isNextCharChinese)
- // {
- // rtnLength += 1;
- // }
- // }
- // else
- // {
- // rtnLength += 1;
- // if (isNextCharChinese)
- // {
- // rtnLength += 1;
- // }
- // }
- // }
- //
- // }
- // else
- // {
- // rtnLength = strInput.Length;
- // }
- // return rtnLength;
- #endregion
- }
- #endregion
- 获取字符串的前几位(按字符串在400中存储的实际长度计算)#region 获取字符串的前几位(按字符串在400中存储的实际长度计算)
- /**//// <summary>
- /// 获取字符串的前几位(按字符串在400中存储的实际长度计算)
- /// </summary>
- /// <param name="strInput"></param>
- /// <param name="length"></param>
- /// <param name="strLeave"></param>
- /// <returns></returns>
- public static string SubStringFOR400(string strInput,int length,ref string strLeave)
- {
- if (LengthOfAS400String(strInput) <= length)
- {
- strLeave = "";
- return strInput;
- }
- for(int i = strInput.Length ;i > 0;i--)
- {
- if (LengthOfAS400String(strInput.Substring(0,i)) <= length)
- {
- strLeave = strInput.Substring(i,strInput.Length - i);
- return strInput.Substring(0,i);
- }
- }
- strLeave = strInput;
- return "";
- }
- #endregion
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
转帖不注明出处,
属于剽窃!
2楼:在AS/400你可以用RPG,在Windows或者Unix与AS/400通信的场合,你需要计算一个字符串发送到AS/400然后保存所需要的字节数的话,Windows或者Unix下就没有RPG可用了。
本帖最后由 franliu 于 2010-11-02 16:02 编辑
哪里需要这么复杂,rpg语言只要一句话就可以搞定啦:
eval lenth = %len(%trim(your_string))