none
VBをC#にコンバートしたい(textBoxに入力された文字に数字以外の文字が含まれているかどうかを判定する) RRS feed

  • 質問

  • 下のVBコード
        If (cs < "0" OrElse cs > "9") AndAlso cs <> "-" Then

        End If
    の部分をエラーになるだろうなと思いながらもC#で
                for (i = 1; i <= checkstr.Length; i++)
                {
                    //検査する文字を1字ずつ抜き出す
                    cs = checkstr.Substring(i, 1);
                    
                    if ((cs < "0" || cs > "9") && cs != "-")
                   
                    {
                        //数字とハイフン以外の文字が含まれていた場合
                        return false;
                    }
                }
    としてみたのですが、
          エラー 1 演算子 '<' を 'string' と 'string' 型のオペランドに適用することはできません。
    とのエラーが出ます。

    取り出した文字が数字かどうかを判定するものがあったような気もするのですが、探せないでいます。


    -------VBコード------------------------------------------------
        Function CheckPhoneNumber(ByVal checkstr As String) As Boolean
            '電話番号の文字列チェック(0~9までの数字、ハイフンのみ)
            '戻り値:適切な文字列または空文字列のとき=True、不適切な文字が含まれるとき=False

            Dim i As Integer
            Dim cs As String

            '空文字列のときにはTrueを返す(未入力を許可するため)
            If checkstr = "" Then Return True

            For i = 1 To Len(checkstr)
                '検査する文字を1字ずつ抜き出す
                cs = Mid(checkstr, i, 1)

                If (cs < "0" OrElse cs > "9") AndAlso cs <> "-" Then
                    '数字とハイフン以外の文字が含まれていた場合
                    Return False
                End If
            Next

            '適切な文字列の場合
            Return True
        End Function


    zen73
    2009年7月26日 4:42

回答

  • ((cs < "0" || cs > "9") は、((cs < '0' || cs > '9') にすればたぶん動くんじゃないでしょうか?
     
    ところで数字をチェックするのであればIsNumeric、IsDigit、TryParseなどが使えますが、この場合だと私はたぶんRegexクラスを使うと思います。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zen73 2009年7月26日 8:20
    2009年7月26日 5:36
    モデレータ
  • 補足すると、

    VBは同一視していますが、C#ではchar(単一の文字)とstring(文字列、charが連なったもの)を区別しています。
    そして、文字列には大小関係は存在しませんが、文字には存在するためこのようなエラーになっています。

    string cs;と宣言されていると思いますが、char cs;とする必要があります。
    checkstr.Substring(i, 1);もcs = checkstr[i];です。
    # VBの配列は1 originですが、C#では0 originですよ。

    そしてRegexを使うと

    bool CheckPhoneNumber( string checkstr){
      return !Regex.IsMatch( checkstr, @"[^0-9\-]" );
    }

    こう書けます。むしろ関数いらない…。VBでもRegexはもちろん使えます。
    • 回答としてマーク zen73 2009年7月26日 8:20
    2009年7月26日 7:44
  • > Regex regex = new Regex("^[-0-9]+$");

    - を先頭に置く書式をご存じなのですね。ただし、.NET Frameworkの正規表現の文字クラスに関する説明 にはそのような書式がないため、\- をおすすめします。
    量指定子として + でなく * を使えば0文字からヒットさせることができます。

    Regexクラスにはzen73さんの書かれたインスタンスメソッドの方法の他に、私の書いたstaticメソッドもあります。
    正規表現のコストを考えて選択してください。
    • 回答としてマーク zen73 2009年7月26日 23:24
    2009年7月26日 9:38

すべての返信

  • ((cs < "0" || cs > "9") は、((cs < '0' || cs > '9') にすればたぶん動くんじゃないでしょうか?
     
    ところで数字をチェックするのであればIsNumeric、IsDigit、TryParseなどが使えますが、この場合だと私はたぶんRegexクラスを使うと思います。
    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/
    • 回答としてマーク zen73 2009年7月26日 8:20
    2009年7月26日 5:36
    モデレータ
  • 補足すると、

    VBは同一視していますが、C#ではchar(単一の文字)とstring(文字列、charが連なったもの)を区別しています。
    そして、文字列には大小関係は存在しませんが、文字には存在するためこのようなエラーになっています。

    string cs;と宣言されていると思いますが、char cs;とする必要があります。
    checkstr.Substring(i, 1);もcs = checkstr[i];です。
    # VBの配列は1 originですが、C#では0 originですよ。

    そしてRegexを使うと

    bool CheckPhoneNumber( string checkstr){
      return !Regex.IsMatch( checkstr, @"[^0-9\-]" );
    }

    こう書けます。むしろ関数いらない…。VBでもRegexはもちろん使えます。
    • 回答としてマーク zen73 2009年7月26日 8:20
    2009年7月26日 7:44
  • >((cs < "0" || cs > "9") は、((cs < '0' || cs > '9') にすればたぶん動くんじゃないでしょうか?
    同じエラーが出ました。

    >string cs;と宣言されていると思いますが、char cs;とする必要があります。
    >checkstr.Substring(i, 1);もcs = checkstr[i];です。
    佐祐里さん、ありがとうございます。たった今、目にしたものですから後で確認させていただきます。

    >この場合だと私はたぶんRegexクラスを使うと思います。
    どういう風につかうのか、とにかくやってみたのが下のコードです。
    それなりに正しくうごいているようなのですが、何かあれば(というより佐祐里さんの関数を使わない方法がある)ご指摘ください。
            public bool CheckPhonNumber(string checkstr)
            {
                //電話番号の文字列チェック(0~9までの数字、ハイフンのみ)
                //戻り値:適切な文字列または空文字列のとき=True、不適切な文字が含まれるとき=False
                Regex regex = new Regex("^[-0-9]+$");

                //空文字列のときにはTrueを返す(未入力を許可するため)
                if (string.IsNullOrEmpty(checkstr)) return true;

                if(!regex.IsMatch(checkstr))
                {
                        //数字とハイフン以外の文字が含まれていた場合
                        return false;
                }
                //適切な文字列の場合
                return true;
            }

    >こう書けます。むしろ関数いらない
    様々なアプローチの仕方があるのですね。とても参考になります。

    trapemiyaさん、佐祐里さん、ありがとうございました。


    zen73
    2009年7月26日 8:19
  • > Regex regex = new Regex("^[-0-9]+$");

    - を先頭に置く書式をご存じなのですね。ただし、.NET Frameworkの正規表現の文字クラスに関する説明 にはそのような書式がないため、\- をおすすめします。
    量指定子として + でなく * を使えば0文字からヒットさせることができます。

    Regexクラスにはzen73さんの書かれたインスタンスメソッドの方法の他に、私の書いたstaticメソッドもあります。
    正規表現のコストを考えて選択してください。
    • 回答としてマーク zen73 2009年7月26日 23:24
    2009年7月26日 9:38
  • 佐祐里さん、ありがとうございます。

    >- を先頭に置く書式をご存じなのですね。
    たまたま手元の本に書かれていたものをそのまま書いた書式に過ぎません。

    C#は2000から始まって今は2008を使っていますが、「動けばよし」という態度ですので基礎が待ったく身についていません。
    丁寧に教えていただいて感謝しております。これからもよろしくお願いします。


    zen73
    2009年7月26日 23:37