C# 正在尝试编写薪资程序,Convert.toDouble中出现错误

C# 正在尝试编写薪资程序,Convert.toDouble中出现错误,c#,C#,我似乎无法实现这一点——在第double weekly\u salary=Convert.ToDouble(令牌[3])行出现错误 .csv内容 Role,Name,PPS,weekly_salary,expense1,expense2 Engineer,Paul Smith,9018731G,700,220,90 Engineer,Gary Murphy,5018473F,650,190,130 Engineer, Peter Tate, 3108318A, 725, 300, 200 Man

我似乎无法实现这一点——在第
double weekly\u salary=Convert.ToDouble(令牌[3])行出现错误

.csv内容

Role,Name,PPS,weekly_salary,expense1,expense2
Engineer,Paul Smith,9018731G,700,220,90
Engineer,Gary Murphy,5018473F,650,190,130
Engineer, Peter Tate, 3108318A, 725, 300, 200
Manager, Larry O'Dwyer, 4012881N, 900, 450, 85
Manager, John O'Connor, 7012812Q, 1100, 360, 75
Assistant Manager, Ryan Smith, 8847233P, 800, 125, 135
Assistant Manager, Mary Leane, 7887323D, 820, 170, 160
Operative, Olivia Mulcahy, 8732432S, 450, 50, 40
Operative, Sarah Buckley, 8923439J, 390, 70, 30
Sales Executive, Ken Wilkins, 7438432D, 560, 110, 110
Sales Executive, Simon McCann, 2382112Y, 610, 140, 200

谢谢

我删除了以前的答案,因为对问题的编辑使问题变得清晰,我的旧答案变得多余

在您的csv数据中,很明显,在一些逗号之后,值之前有空格,这意味着您正试图将(
450
)转换为双精度,即使它前面有空格,因此您应该像这样修剪值

double  weekly_salary = Convert.ToDouble(tokens[3].Trim());
double  expense1 = Convert.ToDouble(tokens[4].Trim());
double  expense2 = Convert.ToDouble(tokens[5].Trim());
使用for循环而不是foreach也会稍微好一点,因为这将意味着您跳过顶行(标题)

for(inti=1;i

这也意味着不使用
line.Split(',')您必须使用
内容行[i].Split(',')

我不确定它是否导致了您的错误,但我确实看到您的代码中存在一个相当严重的错误:

if (tokens[1] == (string)lbEmployees.SelectedItem) ; // This semicolon should not be here
{ 
    double  weekly_salary = Convert.ToDouble(tokens[3]);
    double  expense1 = Convert.ToDouble(tokens[4]);
    double  expense2 = Convert.ToDouble(tokens[5]);

    lblEmployees.Text = "€" + CalculateNetPay(weekly_salary, expense1, expense2).ToString();
}

我在上面的代码中注释的分号实际上提前结束了
if
语句,因此无论
if
语句是否传递,后面的代码块都将运行,这可能会导致意外行为。

您不能只发布代码,期望有人找到问题并为您解决。您应该将代码归结为再现问题所需的最少代码,请参阅。您也没有说明您遇到的问题是什么,是否有错误(如果有,错误是什么)或意外结果(您期望的结果是什么,您得到的值是什么)。对不起。此im的新增功能是在双周_salary=Convert.ToDouble(tokens[3])行上输入并出错;输入字符串的格式不正确。请使用问题下方的“编辑”按钮将此信息添加到问题中,并根据我之前的评论,尝试删除显示此错误所不需要的任何代码。很好的回答..对原始问题的编辑更改太多嗨,谢谢大家的帮助。我不敢相信我错过了。你也是对的,编码是关于在来这里之前学习和做你自己的工作。谢谢你,阿尔菲。如果可能的话,我想看看你提供的其他代码,如果你认为它更有效的话。ThanksI将在此基础上添加额外的部分answer@finbarrdonnelly这真的解决了你的问题吗?我很好奇,因为我写了一个快速测试,能够转换带前导空格的值。我认为这只是一个错误,将代码放入问题框,因为他们在代码的其他地方使用if语句。但如果这真的是他们的错误,那么肯定值得指出out@alfie我不确定情况是否如此。正如我在对你答案的评论中所说的,我写了一个快速测试,让我相信空格并没有导致错误,所以我觉得我应该发布这篇文章以防万一。参考测试
var val=Convert.ToDouble(“740”);断言(val,Is.EqualTo(740))@Phaeze是的分号是我遇到的问题。我不该错过的。但我将添加Alfie提供的更有效的补充。伟大的
for (int i = 1; i < lineOfContents.GetLength(0); i++)
{
    //AllTheCode
}
if (tokens[1] == (string)lbEmployees.SelectedItem) ; // This semicolon should not be here
{ 
    double  weekly_salary = Convert.ToDouble(tokens[3]);
    double  expense1 = Convert.ToDouble(tokens[4]);
    double  expense2 = Convert.ToDouble(tokens[5]);

    lblEmployees.Text = "€" + CalculateNetPay(weekly_salary, expense1, expense2).ToString();
}