2017-07-15 3 views
0

最近私のアプリケーションに、ダウンロードしたファイルから日付を読み取り、ファイルから現在の日付と日付の差を求める関数を追加しました。完了すると、フォーラムのラベルに表示されます。視覚的にチェックしても文字列の比較に失敗しました

例外があります:ファイル内の文字列が "Lifetime"と等しい場合、日付として処理して代替ロジックに従うべきではありません。しかし、文字列が "Lifetime"かどうかをチェックしようとすると、文字列= "Lifetime"であってもtrueを返しません。

EDIT:NisargのヘルプでFormatExceptionを修正しました。今、私のラベルは値に変更されていません。これが問題です。

EDIT2:私は愚かだと感じます。私は1つの機能でMainを2回起動してから、main1を使用してフォームとメインを切り替えてラベルを設定していることが分かりました。 これは、ラベルが正しく機能していなかった理由です。 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"; 
} 
+0

このライン**文字列の添字= File.ReadAllText(Path.GetTempPath()+ txtUsername.Text +」を使用していなければならないと思います。txt "); **変数の文字列データを埋め込む –

+0

' Convert.ToDateTime() 'には日付のような文字列が必要です(2010年7月14日のように)。変換できない文字列「生涯」を送信しています。 – Kevin

+0

@Kevinはい、それは生涯と同じではないことを確認しました。それを止めてはいけませんか? – elite

答えて

0

私はそれがメインのC#でのプログラムの出発点であるので、あなたはドントそれは、プログラムが想定しているところから物事をリセットしたい場合は、別のmethodNameを作るだと思います唯一の私の推測です

から開始するには、あなたのコードの先頭にブレークポイントを作り、あなたはほぼ確実にコード

0

内の各行から何を得るの情報を通じて確認し、文字列の実際の内容ではありません実際に文字列 "Lifetime"。おそらく両側の空白のためです。トリミングしてみてください。

関連編集:

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

あなたが見ることができるように文字列がまだ有効ではありませんDateTime多くなる可能性があるため、このことは、とても壊れやすいです。宿題のようなにおいがしますが、そこに行くと...

2

ファイルを使用しているときに、頻繁に末尾に空白や改行文字があります。 Lifetimeにそれを比較する前に、文字列をトリミングしてみてください。

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

別の(少ない)問題は、比較そのものである可能性があります。 Cで#大文字と小文字を区別して比較します。したがって、lifetimeLifetimeを比較する場合、それらは等しくないとみなされます。あなたはむしろ、大文字と小文字を区別しない比較を使用する必要があります

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

OR

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

をファイルから取得しているsubScriptDateTime.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"; 
} 
+0

私は生涯を言うためにテキストファイルを設定しました。私はそれが大文字と小文字を区別することを知っていたので、それは後で私を台無しにするだろう。限り、余分なキャラクターが行く...私はそれを試して、何も変更されません。 – elite

+0

さて、あなたはより良い状態を試すことができます。私は、文字列比較の代わりにDateTime.TryParseのスニペットを追加します。それが役立つかどうかを見てください。 – Nisarg

+0

これはFormatExceptionを修正しましたが、文字列はまだ空白として表示されます。 – elite

0

私はあなたが

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

} 
else 
{ 
//statement 

} 
関連する問題