C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

時刻のユーザー入力制御について

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■89302 / inTopicNo.1)  時刻のユーザー入力制御について
  
□投稿者/ tetris (24回)-(2018/11/19(Mon) 14:19:04)

分類:[C#] 

c#での時刻の入力制御について質問です。

テキストボックスにて時刻を入力させたいときに
14:30と打っても14時半と打っても、14:30と打っても
「14時30分」に変換するような処理はありますか?

またどのような形式で打っても「14:30」のように変換する方法もありましたら教えて頂きたいです。

理想としてはテキストボックスからフォーカスが外れた時点で処理が実行されたら理想的です。
厳密にいえばcase文を超長く書けば可能なのですが、もっといいやり方がないかなと思いまして・・・。

※出かけるので返事が遅れます。
引用返信 編集キー/
■89310 / inTopicNo.2)  Re[1]: 時刻のユーザー入力制御について
□投稿者/ kiku (62回)-(2018/11/19(Mon) 19:43:09)
他の方法になりますが、下記の記事のように
DateTimePickerで時間だけを入力できるようにするでは
駄目でしょうか?

http://hensa40.cutegirl.jp/archives/7471

引用返信 編集キー/
■89314 / inTopicNo.3)  Re[1]: 時刻のユーザー入力制御について
□投稿者/ WebSurfer (1665回)-(2018/11/20(Tue) 10:59:38)
No89302 (tetris さん) に返信

テキストボックスを使うのを止めてドロップダウン形式にしてはいかがですか?

Web アプリの例ですが、以下のような感じです。

https://transit.yahoo.co.jp/
引用返信 編集キー/
■89380 / inTopicNo.4)  Re[1]: 時刻のユーザー入力制御について
□投稿者/ Jitta (425回)-(2018/11/21(Wed) 21:56:11)
No89302 (tetris さん) に返信
> テキストボックスにて時刻を入力させたいときに
> 14:30と打っても14時半と打っても、14:30と打っても
> 「14時30分」に変換するような処理はありますか?
>
> またどのような形式で打っても「14:30」のように変換する方法もありましたら教えて頂きたいです。

とりあえず、紹介。
https://www.telerik.com/products/winforms/timepicker.aspx
「Free Form DateTime Parsing」と書いてある。


>
> 理想としてはテキストボックスからフォーカスが外れた時点で処理が実行されたら理想的です。
> 厳密にいえばcase文を超長く書けば可能なのですが、もっといいやり方がないかなと思いまして・・・。

フォーカスが外れたときは、イベントで拾える。
case 文?
Windows API に文字種別の変換があるので(あったので)、いわゆる「全角文字」は、いわゆる「半角文字」に変換。
正規表現で「時」を「:」に、「分」を「」に、「半」を「30」に変換。
その後、DateTime.TryParse かな。


あれ?VB? https://docs.microsoft.com/ja-jp/dotnet/api/microsoft.visualbasic.strings.strconv?view=netframework-4.7.2
こっちだった https://msdn.microsoft.com/ja-jp/library/cc448052.aspx
引用返信 編集キー/
■89381 / inTopicNo.5)  Re[2]: 時刻のユーザー入力制御について
□投稿者/ Jitta (426回)-(2018/11/21(Wed) 22:21:32)
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" }),

データなので、仕様の変更に強い。
リスト化されているので、「仕様書から自動生成」も、やろうと思えば可能。
仕様と一致しているかどうかの確認が、実行しなくてできる。

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ