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

我想我是醉了 2012-08-15 02:41:19
索引和长度必须引用该字符串内的位置。
参数名: 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是没问题,但超过就会报错。
...全文
1323 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
我想我是醉了 2012-08-17
  • 打赏
  • 举报
回复
非常感谢各位大侠的帮忙,问题已经解决了。
zhangdaowu5 2012-08-16
  • 打赏
  • 举报
回复
数组下标越界或者超出范围导致的错误。

(smallstr = n5.Substring(len - 3, len);)
你对len的长度去进行一个判断看是否大于小于3,加个判断不就完了,另外LZ你的代码写的眼花缭乱的看的都头大,实在要这样写就自己封装一个方法,那使用起来多方便。
tony312ws 2012-08-15
  • 打赏
  • 举报
回复
直白的说就是你的数组中没有你指定的下标
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

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

static void Main(string[] args)
{
int a=Convert.ToInt32(Console.ReadLine());
Console.Write(a.ToString("N0")……
[/Quote]
20楼的方法解决不了你的问题?你写的的那个也....
zj25810 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

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

static void Main(string[] args)
{
int a=Convert.ToInt32(Console.ReadLine());
Console.Write(a.ToString("N0")……
[/Quote]轻轻一笑...
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复

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


- -这次对了。测过了。上面的想的太美了。
bbjiabcd 2012-08-15
  • 打赏
  • 举报
回复
我晕,每隔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
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
上面写错了应该这样

smallstr = n5.ToArray().ToList().Skip(len - 3 < 0 ? 0 : len - 3).Take(len > n5.Length - 1 ? n5.Length - 1 : len).ToString();
shizhu820228 2012-08-15
  • 打赏
  • 举报
回复
修改为:
  
bigstr = n5.Substring(0, len - 3);
smallstr = n5.Substring(len - 3,3);
杰拉尔 2012-08-15
  • 打赏
  • 举报
回复
这不是结贴了吗

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();
}
zj25810 2012-08-15
  • 打赏
  • 举报
回复
smallstr = n5.Substring(len - 3, len);改为smallstr = n5.Substring(len - 3, 3);
我想我是醉了 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

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


money.Length改为 money.Length-money.IndexOf(".")
[/Quote]
都没到这一步来啊,前面就已经报错了。
我想我是醉了 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

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


money.Length改为 money.Length-money.IndexOf(".")
[/Quote]
都没到这一步来啊,前面就已经报错了。
我想我是醉了 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

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


money.Length改为 money.Length-money.IndexOf(".")
[/Quote]
都没到这一步来啊,前面就已经报错了。
zj25810 2012-08-15
  • 打赏
  • 举报
回复
changestr = n5.Substring(0, len) + "," + changestr + money.Substring(money.IndexOf("."), money.Length);


money.Length改为 money.Length-money.IndexOf(".")
zj25810 2012-08-15
  • 打赏
  • 举报
回复
len改为3
  • 打赏
  • 举报
回复
你可以直接用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
我想我是醉了 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

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

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。
[/Quote]
是这一句报错,超过10000就报错。
我想我是醉了 2012-08-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

smallstr = n5.Substring(len - 3, len);
测试看看这段是不是有问题。
如果你写的是1000
smallstr = n5.Substring(3- 3, 3);
如果你超过了,比如10000
smallstr = n5.Substring(4- 3, 4);(从第2个开始,截取4个。所以就超过了。)
[/Quote]
能否给个具体的解决方法?
zj25810 2012-08-15
  • 打赏
  • 举报
回复
需要测试,我发觉我刚才说的是不对的。

但是你(smallstr = n5.Substring(len - 3, len);)这里肯定有问题。
加载更多回复(5)

62,039

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧