即使在视觉上检查字符串比较也失败

时间:2017-07-15 03:52:50

标签: c# datetime

我最近在我的应用程序中添加了一个函数,它从下载的文件中读取日期,并查找当前日期与文件中日期之间的天数差异。完成后,它会显示在我的某个论坛的标签中。

有一个例外:如果文件中的字符串等于" Lifetime",则不应将其作为日期处理并遵循备用逻辑。但是当我尝试检查字符串是否为" Lifetime"时,即使字符串=" Lifetime"它也不会返回true。

编辑:我在Nisarg的帮助下修复了FormatException。现在,我的标签没有更改为值。这就是问题所在。

EDIT2:我觉得很蠢。我发现我在一个函数中启动Main两次,然后使用main1在表单和main之间切换来设置标签。  这就是标签不能正常工作的原因。感谢Nisarg和所有其他贡献者。

代码示例:

string subScript = File.ReadAllText(Path.GetTempPath() + txtUsername.Text + ".txt");
Main main = new Main();
double dSubLeft;
main.dateLabel.Text = subScript;

if (subScript == "Lifetime") // it bypasses this, apparently blank
{
    main.daysLeftLabel.Text = "Expires: Never";
}

if (subScript != "Lifetime") //Goes here and throws error saying subScript is not valid DateTime
{
    dSubLeft = Math.Round(Convert.ToDouble(Convert.ToString(((Convert.ToDateTime(subScript)) - DateTime.Now).TotalDays)));
    string sSubLeft = Convert.ToString(dSubLeft);
    main.daysLeftLabel.Text = "Expires: " + sSubLeft + " Days";
}

4 个答案:

答案 0 :(得分:2)

使用文件时,您经常会收到尾随空格或换行符。尝试修剪字符串,然后将其与Lifetime进行比较:

subScript = subScript.Trim().Trim(Environment.NewLine.ToCharArray());

另一个(不太可能)问题可能在于比较本身。在C#中,区分大小写的比较。因此,如果您将lifetimeLifetime进行比较,则认为它们不相等。您应该使用不区分大小写的比较:

if(string.Equals(subScript, "Lifetime", StringComparer.OrdinalIgnoreCase))

OR

if(subScript.ToLower() == "lifetime")

您还可以使用subScript检查您从文件中获取的DateTime.TryParse是否为有效日期。

string subScript = File.ReadAllText(Path.GetTempPath() + txtUsername.Text + ".txt");
Main main = new Main();
double dSubLeft;
main.dateLabel.Text = subScript;
DateTime subScriptDate;

if(!DateTime.TryParse(subScript, out subScriptDate))
{
    main.daysLeftLabel.Text = "Expires: Never";
}
else  //Goes here and throws error saying subScript is not valid DateTime
{
    dSubLeft = Math.Round(Convert.ToDouble(Convert.ToString((subScriptDate - DateTime.Now).TotalDays)));
    string sSubLeft = Convert.ToString(dSubLeft);
    main.daysLeftLabel.Text = "Expires: " + sSubLeft + " Days";
}

答案 1 :(得分:0)

我认为这是因为main是C#中程序的起点,如果你不希望它重置程序应该从哪里开始,那就另外创建一个方法名

这只是我的猜测,在代码的开头创建一个断点,并查看从代码中的每一行获得的信息

答案 2 :(得分:0)

几乎可以肯定,字符串的实际内容实际上并不是字符串“Lifetime”。可能是因为两边都有白色空间。尝试修剪。

相关编辑:

if (subscript.Trim() == "Lifetime")
{
    main.daysLeftLabel.Text = "Expires: Never";
}
else // don't retest for the opposite condition
{
...

正如你所看到的,这个东西非常脆弱,因为字符串可能仍然是许多不是有效DateTime的东西。闻起来像家庭作业,但你去... ...

答案 3 :(得分:0)

我认为你应该使用

    if(string.Equals(subScript, "Lifetime", StringComparer.OrdinalIgnoreCase))
{
//statement

}
else
{
//statement

}