索引和长度必须引用该字符串内的位置。
参数名: length  public string MoneyConvert(string money)
   {
   string n5 = string.Empty;
   string changestr = string.Empty;
   string bigstr = string.Empty;
   string smallstr = string.Empty;
   int len = 0;
   if (money.IndexOf(".") > 0)
   {
   n5 = money.Substring(0, money.IndexOf("."));
   }
   else
   {
   n5 = money;
   }
   len = n5.Length;
   changestr = "";
   bigstr = "";
   smallstr = "";
   while (len > 3)
   {
   bigstr = n5.Substring(0, len - 3);
   smallstr = n5.Substring(len - 3, len);   if (changestr != "")
   {
   changestr = smallstr + "," + changestr;
   }
   else
   {
   changestr = smallstr;
   }
   len -= 3;
   }
   if (money.IndexOf(".") > 0)
   {
   if (changestr != "")
   {
   changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);
   }
   else
   {
   changestr = n5.Substring(0, len) + money.Substring(money.IndexOf("."), money.Length);
   }
   }
   else
   {
   if (changestr != "")
   {
   changestr = n5.Substring(0, len) + "," + changestr;
   }
   else
   {
   changestr = n5.Substring(0, len);
   }
   }
   return changestr;
   }
smallstr = n5.Substring(len - 3, len);这一句的时候报错。求解决!
这个是用于做金额转换的,例如,1000 用这个函数转换后就是1,000 每隔三位加一个,号
smallstr = n5.Substring(len - 3<0?0:len - 3, len>n5.Length-1?n5.Length-1:len)这样写的话输入1000是没问题,但超过就会报错。

解决方案 »

  1.   

    Substring越界了,或者 IndexOf 的返回值越界了
      

  2.   

    那肯定截取的时候,开始的索引值和结束的索引值有问题呗,len - 3 或大于len 或len-3成负值了
    你可以试着用String.Format()这个函数来做处理,网上应该有例子
      

  3.   

    smallstr = n5.Substring(len - 3, len);
    测试看看这段是不是有问题。
    如果你写的是1000
    smallstr = n5.Substring(3- 3, 3);
    如果你超过了,比如10000
    smallstr = n5.Substring(4- 3, 4);(从第2个开始,截取4个。所以就超过了。)
      

  4.   

    需要测试,我发觉我刚才说的是不对的。但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。
      

  5.   

    需要测试,我发觉我刚才说的是不对的。但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。
      

  6.   

    你可以直接用ToString()
    格式说明符 说明 示例 输出 
    C 货币 2.5.ToString("C") ¥2.50 
    D 十进制数 25.ToString("D5") 00025 
    E 科学型 25000.ToString("E") 2.500000E+005 
    F 固定点 25.ToString("F2") 25.00 
    G 常规 2.5.ToString("G") 2.5 
    N 数字 2500000.ToString("N") 2,500,000.00 
    X 十六进制 255.ToString("X") FF 具体代码就是
     string temp = "2500000.0056";
                    int count = Regex.Match(temp,@"(?<=\.)\d+").Value.Length;
                    string ss = double.Parse(temp).ToString("N" + count);//2,500,000.0056
      

  7.   

    changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);
    money.Length改为 money.Length-money.IndexOf(".")
      

  8.   

    smallstr = n5.Substring(len - 3, len);改为smallstr = n5.Substring(len - 3, 3);
      

  9.   

    这不是结贴了吗  if (n5.Length < 500)
                {
                    n5.Substring(len - 3 < 0 ? 0 : len - 3, len > n5.Length - 1 ? n5.Length - 1 : len);
                }
                else {
                    smallstr = n5.ToArray().ToList().Skip(len - 3 < 0 ? 0 : len - 3).Skip(len > n5.Length - 1 ? n5.Length - 1 : len).ToString();
                }
      

  10.   

    修改为:
      
    bigstr = n5.Substring(0, len - 3);
    smallstr = n5.Substring(len - 3,3);
      

  11.   

    上面写错了应该这样          smallstr = n5.ToArray().ToList().Skip(len - 3 < 0 ? 0 : len - 3).Take(len > n5.Length - 1 ? n5.Length - 1 : len).ToString();
      

  12.   


          int strar = len - 3 < 0 ? 0 : len - 3;
                int length = len > n5.Length - 1 ? n5.Length - 1 : len;
                n5.ToArray().ToList().Skip(strar).Take(length).ToList().ForEach(c => { smallstr += c; });
    - -这次对了。测过了。上面的想的太美了。
      

  13.   

    我晕,每隔3位+逗号直接用ToString("N0")不就行了,还弄出那么一大段的方法来-_-`static void Main(string[] args)
            {
                int a=Convert.ToInt32(Console.ReadLine());
                Console.Write(a.ToString("N0"));
                Console.ReadKey();
            }输入:3456789
    输出:3,456,789
      

  14.   

    数组下标越界或者超出范围导致的错误。(smallstr = n5.Substring(len - 3, len);) 
    你对len的长度去进行一个判断看是否大于小于3,加个判断不就完了,另外LZ你的代码写的眼花缭乱的看的都头大,实在要这样写就自己封装一个方法,那使用起来多方便。