我在这个编程领域没有太多经验,而且我遇到了以下错误:
输入字符串的格式不正确。
这显示在我的代码的以下行中:
decimal amount = decimal.Parse(entry.Split('$')[0]);
我不太确定如何解决这个问题,我们将不胜感激。
File.WriteAllText("C:\\Users\\Harry\\Documents\\Streamtip\\tip-top.txt", String.Empty);
Dictionary<string, decimal> names = new Dictionary<string, decimal>();
sR = new StreamReader("C:\\Users\\Harry\\Documents\\Streamtip\\tip-list-recent.txt");
while (!sR.EndOfStream)
{
string line = sR.ReadLine();
var entries = line.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var entry in entries)
{
decimal amount = decimal.Parse(entry.Split('$')[0]);
string nameSplit = entry.Split('.', ':')[1].Trim();
if (names.ContainsKey(nameSplit))
{
names[nameSplit] += amount;
Console.WriteLine("Hoozah!");
}
else
{
names.Add(nameSplit, amount);
Console.WriteLine("Failure");
}
}
} sR.Close();
EDIT 输入数据
1. Jim: $22.00, 2. Jim: $2100.00, 3. Jim: $6.00, 4. Jim: $32.00, 5. Jim: $2.00,
答案 0 :(得分:4)
认为您希望entry.Split('$')[1]
不是entry.Split('$')[0]
,因为美元价值是在美元符号之后。
一般情况下,您应该使用decimal.TryParse()
来检查输入错误,或者检查来自decimal.Parse()
的各种异常:
try
{
decimal amount = decimal.Parse(entry.Split('$')[1]);
}
catch (FormatException ex)
{
// handle the error.
}
例如:
foreach (var entry in entries)
{
try
{
var tokens = entry.Split('$');
decimal amount;
if (tokens.Length > 1)
amount = decimal.Parse(tokens[1]);
else
throw new FormatException("invalid entry");
string nameSplit = entry.Split('.', ':')[1].Trim();
if (names.ContainsKey(nameSplit))
{
names[nameSplit] += amount;
Console.WriteLine("Hoozah!");
}
else
{
names.Add(nameSplit, amount);
Console.WriteLine("Failure");
}
}
catch (FormatException)
{
Console.WriteLine(string.Format("Format exception for entry \"{0}\"", entry));
}
catch (Exception ex)
{
Console.WriteLine(string.Format("{0} for entry \"{1}\"", ex.GetType().Name, entry));
}
}
<强>更新强>
然后,如果您需要输出每个名字的总金额,您可以在例程结束时执行:
foreach (var pair in names)
Console.WriteLine(string.Format("{0}: {1:C2}", pair.Key, pair.Value));
答案 1 :(得分:2)
您假设entry.Split('$')[0]
是数字值,而不是。在阅读用户输入时,您应该使用TryParse()
代替,以便捕获错误。
编辑:dbc是对的,但你仍然应该这样做,而不是假设你的输入文件是完美的。
decimal amount = 0;
if (decimal.TryParse(entry.Split('$')[0], out amount))
{
string nameSplit = entry.Split('.', ':')[1].Trim();
if (names.ContainsKey(nameSplit))
{
names[nameSplit] += amount;
Console.WriteLine("Hoozah!");
}
else
{
names.Add(nameSplit, amount);
Console.WriteLine("Failure");
}
}
else
{
// the input file has an invalid line, do something about it
}
答案 2 :(得分:2)
decimal.Parse
有一个接受NumberStyle
的重载,您可以选择Currency
。这样可以避免使用split
并从$
拆分字符串。
decimal amount = decimal.Parse(entry, NumberStyles.Currency);