“输入字符串格式不正确”在解析过程中
本文关键字:过程中 不正确 输入 字符串 格式 | 更新日期: 2023-09-27 18:30:49
我在编程领域没有太多经验,我陷入了以下错误:
输入字符串的格式不正确。
这出现在我的代码的以下行中:
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();
编辑输入的数据
1. Jim: $22.00, 2. Jim: $2100.00, 3. Jim: $6.00, 4. Jim: $32.00, 5. Jim: $2.00,
认为您希望不要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));
你假设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
}
decimal.Parse
有一个接受NumberStyle
的重载,你可以选择Currency
。这避免了必须使用 split
并将字符串与$
分开。
decimal amount = decimal.Parse(entry, NumberStyles.Currency);