|
■No89302 (tetris さん) に返信
>理想としてはテキストボックスからフォーカスが外れた時点で処理が実行されたら理想的です。
>厳密にいえばcase文を超長く書けば可能なのですが、もっといいやり方がないかなと思いまして・・・。
例えば、switch case を使うと、こんな感じ。
var sb = new StringBuilder()
var inputString = "14:30";
foreach (var c in inputString)
{
switch (c)
{
case '1':
sb.Append("1");
break;
case '2':
// 以下略
default:
sb.Append(c);
}
}
で、「時を':'にしなきゃ」ってんで、case 文を増やす。
まぁ、あり得ないと思うけど、こんな間違い。
switch (c)
{
case '1':
sb.Append("1");
break;
case '2':
// 以下略
default:
sb.Append(c);
case '時':
sb.Append(":");
break;
}
なんにしても、実行時にいちいち「マッチするまで比較する」ので、遅くなる。
そこで、コードをデータ化しちゃいましょう。
List<Tuple<String, String>> convDict = new List<Tuple<String, String>>
{
new Tuple<String, String>({ "1", "1" }),
new Tuple<String, String>({ "2", "2" }),
// 中略
new Tuple<String, String>({ "時", ":" }),
new Tuple<String, String>({ "分", "" }),
};
foreach (var lst in convDict)
{
inputString = Regex.Replace(inputString, lst.Item1, lst.Item2, RegexOption.None, Regex.InfiniteMatchTimeout); // 引数は調べ直して
}
「半を30に」は、データに1行追加するだけ。
new Tuple<String, String>({ "半", "30" }),
データなので、仕様の変更に強い。
リスト化されているので、「仕様書から自動生成」も、やろうと思えば可能。
仕様と一致しているかどうかの確認が、実行しなくてできる。
|