索引和长度必须引用该字符串内的位置

时间:2021-08-21 10:50:47
索引和长度必须引用该字符串内的位置。
参数名: 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是没问题,但超过就会报错。

25 个解决方案

#1


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

#2


但这个函数用js写没有一点问题啊!

#3


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

#4


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

#5


需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。

#6


需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。

#7


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

能否给个具体的解决方法?

#8


引用 5 楼  的回复:
需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。

是这一句报错,超过10000就报错。

#9


你可以直接用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

#10


len改为3

#11


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


money.Length改为 money.Length-money.IndexOf(".")

#12


引用 11 楼  的回复:
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")

都没到这一步来啊,前面就已经报错了。

#13


引用 11 楼  的回复:
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")

都没到这一步来啊,前面就已经报错了。

#14


引用 11 楼  的回复:
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")

都没到这一步来啊,前面就已经报错了。

#15


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

#16


这不是结贴了吗

  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();
            }

#17


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

#18


上面写错了应该这样

          smallstr = n5.ToArray().ToList().Skip(len - 3 < 0 ? 0 : len - 3).Take(len > n5.Length - 1 ? n5.Length - 1 : len).ToString();

#19



      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; });


- -这次对了。测过了。上面的想的太美了。

#20


我晕,每隔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

#21


引用 20 楼  的回复:
我晕,每隔3位+逗号直接用ToString("N0")不就行了,还弄出那么一大段的方法来-_-`
C# code

static void Main(string[] args)
        {
            int a=Convert.ToInt32(Console.ReadLine());
            Console.Write(a.ToString("N0")……
轻轻一笑...

#22


引用 20 楼  的回复:
我晕,每隔3位+逗号直接用ToString("N0")不就行了,还弄出那么一大段的方法来-_-`
C# code

static void Main(string[] args)
        {
            int a=Convert.ToInt32(Console.ReadLine());
            Console.Write(a.ToString("N0")……

20楼的方法解决不了你的问题?你写的的那个也....

#23


直白的说就是你的数组中没有你指定的下标

#24


数组下标越界或者超出范围导致的错误。

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

#25


非常感谢各位大侠的帮忙,问题已经解决了。

#1


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

#2


但这个函数用js写没有一点问题啊!

#3


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

#4


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

#5


需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。

#6


需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。

#7


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

能否给个具体的解决方法?

#8


引用 5 楼  的回复:
需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。

是这一句报错,超过10000就报错。

#9


你可以直接用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

#10


len改为3

#11


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


money.Length改为 money.Length-money.IndexOf(".")

#12


引用 11 楼  的回复:
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")

都没到这一步来啊,前面就已经报错了。

#13


引用 11 楼  的回复:
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")

都没到这一步来啊,前面就已经报错了。

#14


引用 11 楼  的回复:
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")

都没到这一步来啊,前面就已经报错了。

#15


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

#16


这不是结贴了吗

  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();
            }

#17


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

#18


上面写错了应该这样

          smallstr = n5.ToArray().ToList().Skip(len - 3 < 0 ? 0 : len - 3).Take(len > n5.Length - 1 ? n5.Length - 1 : len).ToString();

#19



      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; });


- -这次对了。测过了。上面的想的太美了。

#20


我晕,每隔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

#21


引用 20 楼  的回复:
我晕,每隔3位+逗号直接用ToString("N0")不就行了,还弄出那么一大段的方法来-_-`
C# code

static void Main(string[] args)
        {
            int a=Convert.ToInt32(Console.ReadLine());
            Console.Write(a.ToString("N0")……
轻轻一笑...

#22


引用 20 楼  的回复:
我晕,每隔3位+逗号直接用ToString("N0")不就行了,还弄出那么一大段的方法来-_-`
C# code

static void Main(string[] args)
        {
            int a=Convert.ToInt32(Console.ReadLine());
            Console.Write(a.ToString("N0")……

20楼的方法解决不了你的问题?你写的的那个也....

#23


直白的说就是你的数组中没有你指定的下标

#24


数组下标越界或者超出范围导致的错误。

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

#25


非常感谢各位大侠的帮忙,问题已经解决了。