このSubString.PadLeftが何をしているのか理解できません
質問
私がデバッグしているこのコードには、次のコードの抜粋があります。
ddlExpYear.SelectedItem.Value.Substring(2).PadLeft(2, '0');
これは何を返しますか?これは実際のクレジット カード アプリケーションの一部であるため、あまり実行できません。名前から想像できるように、DropDownList には 4 桁の年が含まれています。
アップデート:みんな、ありがとう。私は .NET 開発をあまりしないので、簡単なテストをセットアップするのはそれほど簡単ではありません。
解決
西暦の下 2 桁を取得し、最大 2 文字になるまで左側にゼロを埋め込みます。08、07 などで終わる有効期限の年に対する「念のため」のように見え、先頭のゼロが存在することを確認します。
他のヒント
これにより、コンソールに「98」が出力されます。
class Program
{
static void Main(string[] args)
{
Console.Write("1998".Substring(2).PadLeft(2, '0'));
Console.Read();
}
}
もちろんこれを実行することもできます。デバッグしているアプリケーションでは実行できません。見た目だけでなく、それが何をしているのかを知るには、新しい Web アプリケーションを作成し、DropDownList に配置し、その中に静的な年をいくつか入れてから、先ほど述べたコードを入力して、それが何をしているのかを確認してください。そうです。そうすれば確実に分かります。
あほらしいもの。選択した項目の値を取得し、最初の 2 文字以降のすべてを取得します。1 文字のみの場合は先頭に「0」が追加され、0 文字の場合は「00」が返されます。これが愚かであると言う理由は、値を 2 文字の長さにする必要がある場合、ドロップダウン リストを作成するときに最初からそのように設定すればよいのではないかからです。
3 番目の文字 (0 ベースの場合) から最後まで部分文字列を取得しているように見えます。その後、部分文字列の長さが 2 未満の場合は、左側に 0 を追加して長さを 2 にしています。
PadLeft は、入力から少なくとも 2 文字を受け取り、入力 (左側) を適切な文字で埋め込みます。したがって、この場合、入力は 12 になる可能性があります。「12」が返ってきます。または、入力が 9 である場合もあり、その場合は「09」が返されます。
これは複雑な連鎖の例です (「 「連鎖するメリットはあるのか?」 post) 失敗して、コードが過度に複雑に見えるようになりました。
部分文字列は最初の 2 文字をスキップした値を返し、padleft は結果の先頭にゼロを埋め込みます。
string s = "2014";
MessageBox.Show(s.Substring(2).PadLeft(2, 'x')); //14
string s2 = "14";
MessageBox.Show(s2.Substring(2).PadLeft(2, 'x')); //xx
私の推測では、コードは年を2桁の値に変換しようとしていると思います。
PadLeft は、ユーザーが 2 桁または 3 桁の年を入力した場合にのみ何らかの処理を行います。
1 桁の年では、例外が発生します (サブリング エラー)。
2 桁の年 (07、08 など) の場合、00 が返されます。これは間違いだと思います。
3 桁の年 (207、208) の場合、作成者はタイプミスであると考えたため、最後の桁にゼロが埋め込まれて返されます -- 207 -> 07;208→08。
ユーザーが年を選択する必要があり、年の入力が許可されていない限り、PadLeft は不要です。4 桁の年が与えられた場合、Substring(2) がまさに必要なことを行います。
このコードは、4 桁の年から 2 桁の年を取得しようとしているようです (ddlexpyear がヒントです)
これは文字列を受け取り、文字列を返すため、文字列区切り文字は使用しません。
- 1998 -> 98
- 2000 -> 00
- 2001 -> 01
- 2012 -> 12
問題は、それが良い仕事をしないことです。このような場合、パディングは実際には役に立ちません。パッドコードを削除しても、正しくなるケースには影響しません。
したがって、このコードは 4 桁の年については (パッドの有無にかかわらず) 機能しますが、他の長さの文字列ではどうなるでしょうか?
- ヌル:例外
- 0:例外
- 1:例外
- 2:常に「00」を返します。例えば49 年(ユダヤ人がローマから追放された年)は「00」になります。これは悪いです。
- 3:最後の数字を保存し、その前に「0」を置きます。10% のケース (304 や 908 など、2 番目の桁が実際にはゼロの場合) は正しいですが、残りのケース (915、423、110 など) は完全に間違っています。
- 5:3 桁目と 4 桁目を保存するだけですが、これも間違っています。「10549」はおそらく「49」であるべきですが、代わりに「54」になっています。
- ご想像のとおり、問題はさらに高い桁で継続します。
OK、ドロップダウンから値を取得しています、ABCD
次に、位置 2、CD から部分文字列を取得します。
そして、エラーです、必要に応じて左にゼロを2つ埋め込みます、CD
または、X を終了したばかりの場合は、X に部分文字列を付け、OX にパディングします。
西暦の下 2 桁を取得し、左側に「0」を埋め込みます。
したがって、2010 年は 10、2009 年は 09 になります。
なぜ開発者がドロップダウンの値を最後の 2 桁に設定しなかったのか、また、なぜ (西暦 0 年から 9 年を扱う場合を除いて) 左詰めする必要があるのかわかりません。