2017-12-11 1 views
1

私は、入力時にフィールドの日付の書式設定を強制する方法に非常に興味をそそられたプログラムを使用しています。たとえば、「10217」を入力すると、システムは自動的にフィールドを10/02/2017に強制します。しかし、私が1117を入れた場合、01/01/2017、11/17/??、または他の多くの組み合わせのように何も起こりません。誰もがこの強制的なフォーマットがロジックに関してどのように達成されているのか知っていますか?日付ボックスの強制書式設定ロジック

さらに、10.2.17という形式の同じフィールドに日付を入れることができ、2017年10月2日に再フォーマットされます。同様に、1.1.17を入力すると、2011年1月1日に再フォーマットされます。最後に、スラッシュを入れて同じことをすることができ、それぞれの日付形式を再フォーマットします。だから私が10/2/17に入れたら、それは10/2/2017に再フォーマットされます。 1/1/17と入力すると同じことが、2011年1月1日に再フォーマットされます。

私は次のリンクを見てきましたが、この種のロジックを実行するために使用できるものは見当たりません。

https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

だけでなく、(私はそれが欠けて露骨である可能性があります。確かに)、私は正規表現を取り巻くこの例を見てきましたが、私は、このプロセスに精通していないです。

Validating a date format string in c#

私はこれがたくさんあることを理解が、これはすべてのロジックをフォーマット強制日付を中心に展開。私は本当に私が欲しいものを達成するためにどのようなロジックを使用するのか、私が探しているものを達成するためにどのような論理を一緒にするのかを確かめていません。私はすべての入力を非常に感謝します。

+0

ほとんどの場合、テキストボックスの値を設定し、特定の形式を使用して日付を書式設定、その後、現在までに入力を解析していますさ。 C#には、すべてのステップを一度に行うための「魔法の弾丸」はありません。それはどのように行われているかは、プラットフォーム(c#サーバ側、javaScriptクライアント側など)によって異なります。また、日付があいまいな場合(「10/2/2017」など)、「推測」するロジックがあるかもしれません。 –

+0

それは理にかなっている。どのようにしてそれが行われるかにはあまりにも多くの変数があるかもしれません。私はそれがクライアントのサイトで行われていると言うことができ、ソフトウェアはC#/ .netにありますが、私が知っているJavaScriptは見たことがありません。私はそれを探す必要があります。あなたはこれをどう扱うかについて簡単な提案をしていますか?私はどのような方法で私たちがテキストを解析するか、私が見つけることができるすべての事例をコード化する必要があるかどうかを確かめることができませんでした。 (注:私は開発中のソフトウェアでこれを複製しようとしています) –

答えて

1

私はこの問題にアプローチするために、ユーザーの入力を解析するために何が使用されているかを確認する必要があると考えています。 DateTime.Parseを使用している場合、解析される文字列があいまいであるときに例外がスローされます。

もちろん、プログラマはフィールド内の入力を解析する独自の方法を作成できます。一般的にプログラマは、情報を解析する際にあいまいなケースを扱うことに熱心ではありません。だから簡単にするためにDateTime.Parseメソッドを使って作業していると仮定しましょう。

パーサーが何かをあいまいと見なすことができるように、次のプログラムを作成しました。プログラムの出力は、この絵で示されています:

enter image description here

コードが実証DateTime.Parse:

あなたがに似た何かを行うことができます文字列に戻ってのDateTimeを変換するために
static void Main(string[] args) 
{ 
    string input = ""; 
    while(input != "exit" || input != "Exit") 
    { 
     Console.Write("Input: "); 
     input = Console.ReadLine(); 

     string inputDate = input; 
     //try to parse it 
     try 
     { 
      DateTime date = DateTime.Parse(inputDate); 
      Console.WriteLine(date+"\n"); 
     } 
     catch 
     { 
      //Exceptions. String not valid because ambiguity 
      Console.WriteLine("Ambiguous.\n"); 
      //In here can also perform other logic, of course 
     } 

    } 

} 

:日付が入力されていることのためにあなたが結果をacheiveことができるように

try 
{ 

    DateTime date = DateTime.Parse(inputDate); 
    Console.WriteLine(date+"\n"); 
    string month = date.Month.ToString(); 
    string day = date.Day.ToString(); 
    string year = date.Year.ToString(); 
    string resultingString = month + " " + day + " " + year ; 
    Console.WriteLine(resultingString); 
} 
catch(Exception e) 
{ 
    //Exceptions. String not valid because ambiguity 
    Console.WriteLine("Ambiguous"); 
} 

あなたも、この方法では、この情報を使用して独自のパーサを作ることができます3文字の長さ:

static void Main(string[] args) 
    { 
     string input = ""; 
     while(input != "exit" || input != "Exit") 
     { 
      Console.Write("Input: "); 
      input = Console.ReadLine(); 

      string inputDate = input; 

      try 
      { 

       DateTime date = DateTime.Parse(inputDate); 
       Console.WriteLine(date+"\n"); 
       string month = date.Month.ToString(); 
       string day = date.Day.ToString(); 
       string year = date.Year.ToString(); 
       string resultingString = month + " " + day + " " + year; 
       //string resultingString = month + "/" + day + "/" + year; 
       Console.WriteLine(resultingString); 
      } 
      catch(Exception e) 
      { 
       //Exceptions. String not valid because ambiguity 
       try 
       { 
        Console.WriteLine(myParser(inputDate)); 
       } 
       catch 
       { 
        Console.WriteLine("Ambiguous"); 
       } 

       //Console.WriteLine("Ambiguous.\n"); 
       //In here can also perform other logic, of course 
      } 

     } 

    } 

    static string myParser(string input) 
    { 
     string month,day,year,date; 

     switch (input.Length) 
     { 
      //In the case that it's 1 character in length 
      case 1: 
       return "Ambiguous."; 
      case 2: 
       return "Ambiguous."; 

      //did user mean #/#/200#? hopefully not #/#/199#... 
      case 3: 
       month = input.Substring(0, 1); 
       day = input.Substring(1, 1); 
       year = input.Substring(2, 1); 
       date = month + " " + day + " " + year; 
       return date; 
      //did user mean # # 20## 
      //or    # ## 200# 
      //or    ## # 200# 
      case 4: 

       return "Ambiguous"; 
      //user probably means ## # ## 
      case 5: 
       return "Ambiguous"; 
      case 6: 
       return "Ambiguous"; 
      default: 
       return "Ambiguous"; 
     } 


    } 

enter image description here

同様に、あなたが戻っスラッシュ(/)に日付を取得分と時間と、そのようなことなく、文字列の形式でフォーマットを区切りにしたい場合は...

case 3: 
    month = input.Substring(0, 1); 
    day = input.Substring(1, 1); 
    year = input.Substring(2, 1); 
    date = month + " " + day + " " + year; 

    DateTime dateTimeObj = DateTime.Parse(date); 

    month = dateTimeObj.Month.ToString(); 
    day = dateTimeObj.Day.ToString(); 
    year = dateTimeObj.Year.ToString(); 

    string resultingString = month + "/" + day + "/" + year; 

    return resultingString; 

enter image description here

+0

これは出力が正確に私が探しているものとして使用していると私は信じています。あなたがここでやったことをあまりにも広げると、時間を見せない方法がありますか?その形式で日付だけを制限するには?私はオプションを探しましたが、私はそれを見ませんでした。また、有効な解析可能な文字列が入力されるまで、私のコードはそれをボックスに戻すように強制します。ありがとう –

+0

@ RyanWakefieldこれはあなたが探していた解析動作へのアプローチの一種であることを願っています。 – Jamin

+0

@RyanWakefield申し訳ありません私は余分なパースを見せて再び編集しました。また、日付の入力は難しいので、実装のチェックと基本的なテストを行うことが重要ですので、必要な解析情報が得られているかどうかを確認することができます。テストが多いほど、DateTimeと独自の解析メソッドの解析動作を文字列で理解することが多くなります。 – Jamin