获取字符串在AS400中存储的实际长度

发布于 2022-09-08 04:57:11 字数 6369 浏览 16 评论 2

由于as400中存储中文字符时带有前导符和后导符,c#中获取字符串长度并非字符串在400种实际存储长度,
故作了以下方法,代码如下:

  1. #region 获取字符串在400中存储实际占用的长度
  2.   /**//// <summary>
  3.   ///  获取字符串在400中存储实际占用的长度
  4.   ///  creator: zhengjx
  5.   /// </summary>
  6.   /// <param name="strInput"></param>
  7.   /// <returns></returns>
  8.   public static int LengthOfAS400String(string strInput)
  9.   {
  10.    /**////400中文字符规则:中文字符串前面应该有前导符,后面紧跟后导符
  11.    ///所以总长度应该 = strInput.Length + 中文字符数 + 中文字符串数*2
  12.    int rtnLength = strInput.Length;
  13.    Regex               regex = new Regex(@"[u0100-uffff]+");
  14.    MatchCollection   matches = regex.Matches(strInput);
  15.    for( int i = 0; i != matches.Count; ++i )
  16.    {
  17.     rtnLength += matches[i].Value.ToString().Trim().Length + 2;
  18.    }
  19.    return rtnLength;
  20.    另外一种方法:遍历字符串来判断(注释)#region 另外一种方法:遍历字符串来判断(注释)
  21.    //   int rtnLength = 0;
  22.    //   if (HasChinese(strInput))
  23.    //   {
  24.    //    char[] cArr = strInput.ToCharArray();
  25.    //    bool isNextCharChinese = false;
  26.    //   
  27.    //    for(int i = 0; i<cArr.Length ; i++)
  28.    //    {
  29.    //     if ( i== cArr.Length - 1)
  30.    //     {
  31.    //      //最后一个字符如果是中文,应该+3 (中文2个字符+一个后导符)
  32.    //      if (HasChinese(cArr[i].ToString().Trim()))
  33.    //      {
  34.    //       rtnLength += 3;
  35.    //       //第一个字符如果是中文,应该多加一个前导符
  36.    //       if ( i == 0)
  37.    //       {
  38.    //        rtnLength += 1;
  39.    //       }
  40.    //      }
  41.    //      else
  42.    //      {
  43.    //       rtnLength += 1;
  44.    //      }
  45.    //      continue;
  46.    //     }
  47.    //
  48.    //     isNextCharChinese = HasChinese(cArr[i+1].ToString().Trim());
  49.    //     
  50.    //     if (HasChinese(cArr[i].ToString().Trim()))
  51.    //     {
  52.    //      //第一个字符如果是中文,应该多加一个前导符
  53.    //      if ( i == 0)
  54.    //      {
  55.    //       rtnLength += 1;
  56.    //      }
  57.    //      rtnLength += 2;
  58.    //      //如果当前字符是中文,且下一个字符是英文,则应多加一个后导符
  59.    //      if (!isNextCharChinese)
  60.    //      {
  61.    //       rtnLength += 1;
  62.    //      }
  63.    //     }
  64.    //     else
  65.    //     {
  66.    //      rtnLength += 1;
  67.    //      if (isNextCharChinese)
  68.    //      {
  69.    //       rtnLength += 1;
  70.    //      }
  71.    //     }
  72.    //    }
  73.    //
  74.    //   }
  75.    //   else
  76.    //   {
  77.    //    rtnLength = strInput.Length;
  78.    //   }
  79.    //   return rtnLength;
  80.    #endregion
  81.   }
  82.   #endregion
  83.   获取字符串的前几位(按字符串在400中存储的实际长度计算)#region  获取字符串的前几位(按字符串在400中存储的实际长度计算)
  84.   /**//// <summary>
  85.   /// 获取字符串的前几位(按字符串在400中存储的实际长度计算)
  86.   /// </summary>
  87.   /// <param name="strInput"></param>
  88.   /// <param name="length"></param>
  89.   /// <param name="strLeave"></param>
  90.   /// <returns></returns>
  91.   public static string SubStringFOR400(string strInput,int length,ref string strLeave)
  92.   {
  93.    if (LengthOfAS400String(strInput) <= length)
  94.    {
  95.     strLeave = "";
  96.     return strInput;
  97.    }
  98.    for(int i = strInput.Length ;i > 0;i--)
  99.    {
  100.     if (LengthOfAS400String(strInput.Substring(0,i)) <= length)
  101.     {
  102.      strLeave = strInput.Substring(i,strInput.Length - i);
  103.      return strInput.Substring(0,i);
  104.     }
  105.    }
  106.    strLeave = strInput;            
  107.    return "";
  108.   }
  109.   #endregion

复制代码

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

蓝海似她心 2022-09-11 13:38:04

转帖不注明出处,
属于剽窃!

2楼:在AS/400你可以用RPG,在Windows或者Unix与AS/400通信的场合,你需要计算一个字符串发送到AS/400然后保存所需要的字节数的话,Windows或者Unix下就没有RPG可用了。

赠我空喜 2022-09-11 07:17:11

本帖最后由 franliu 于 2010-11-02 16:02 编辑

哪里需要这么复杂,rpg语言只要一句话就可以搞定啦:

    eval      lenth = %len(%trim(your_string))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文