none
IsDigitとIsNumberの違い。 RRS feed

  • 質問

  • CharクラスのIsDigitとIsNumberの違いについて教えてください。
        Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
            Dim s As Char = e.KeyChar

            Debug.WriteLine(Char.IsDigit(s), "IsDigit")
            Debug.WriteLine(Char.IsNumber(s), "IsNumber")
        End Sub
    最終的には、0から9の数字だけを入れるようにしたいのですが、
    どちらも同じ結果が返ってくるようです。

    どこが違うのでしょうか。

    また0から9の数字だけを許可する場合、どちらを使う方がより良いのでしょうか。

     

    よろしくお願いいたします。

    2008年2月17日 3:02

回答

  • 「123」「123」などは、双方ともに True を返します。

    「壱弐参」「一二三」などは、双方ともに False を返します。

    「ⅠⅡⅢ」「ⅰⅱⅲ」「①②③」「⑽⒑❿➉」などは、IsNumber は True ですが、IsDigit は False です。

     

     

    どちらを使うべきかは、アプリケーションの仕様によります。たとえば、

     「全角を入れられたら、半角に自動補正される」

    という、初心者ユーザにも親切なシステムを作りたい場合もあれば、

     「全角を入れたらエラーにしなければならない」

    という厳密な判断を求められる場合もありますよね。

     

    なお、特定の文字のみを許可したいのであれば、このような書き方もあります。

     

    Code Snippet

    Const AllowChars As String = "1234567890"   '許可したい文字の一覧
    Dim c As Char = 検査対象の1文字
    If AllowChars.IndexOf(c) < 0 Then
     '許可されていない文字
    Else
     '許可された文字
    End If

     

    2008年2月17日 3:39
  • IsDigit は、アラビア数字である場合に true となりますが、IsNumber の場合は、アラビア数字以外に、ローマ数字や丸数字も true となります。

    0から9の数字だけを許可する場合は、IsDigit を使うことになりますが、IsDigit は全角数字も true となることに注意してください。

    2008年2月17日 3:42

すべての返信

  • 「123」「123」などは、双方ともに True を返します。

    「壱弐参」「一二三」などは、双方ともに False を返します。

    「ⅠⅡⅢ」「ⅰⅱⅲ」「①②③」「⑽⒑❿➉」などは、IsNumber は True ですが、IsDigit は False です。

     

     

    どちらを使うべきかは、アプリケーションの仕様によります。たとえば、

     「全角を入れられたら、半角に自動補正される」

    という、初心者ユーザにも親切なシステムを作りたい場合もあれば、

     「全角を入れたらエラーにしなければならない」

    という厳密な判断を求められる場合もありますよね。

     

    なお、特定の文字のみを許可したいのであれば、このような書き方もあります。

     

    Code Snippet

    Const AllowChars As String = "1234567890"   '許可したい文字の一覧
    Dim c As Char = 検査対象の1文字
    If AllowChars.IndexOf(c) < 0 Then
     '許可されていない文字
    Else
     '許可された文字
    End If

     

    2008年2月17日 3:39
  • IsDigit は、アラビア数字である場合に true となりますが、IsNumber の場合は、アラビア数字以外に、ローマ数字や丸数字も true となります。

    0から9の数字だけを許可する場合は、IsDigit を使うことになりますが、IsDigit は全角数字も true となることに注意してください。

    2008年2月17日 3:42
  • 外池と申します。

     

    結論は、IsDigitとお答えしたいところですが、ちょっと微妙です。半角数字0~9のみを判定したいのであれば、IsDigitでも不十分です。全角の数字0~9を許容するのであれば、IsDigitでOKだと思います。

     

    このあたり、ドキュメントだけを読んでいても理解しきれない(説明が極めて不十分)ので、私の場合は、十個程度の文字の識別であれば、自分で判断する関数を書いてしまいます。以下、参考になれば。

     

    全角の「0」について、

    Char.IsDigit("0"c)    True   
    Char.IsNumber("0"c)    True

    漢数字の「五」について、

    Char.IsDigit("五"c)        False
    Char.IsNumber("五"c)   False

    全角の「V」(ローマ字のブイ)

    Char.IsDigit("Ⅴ"c)    False
    Char.IsNumber("Ⅴ"c)    True

     

    半角の「V」(ローマ字のブイ)

    Char.IsDigit("V"c)    False
    Char.IsNumber("V"c)    False

     

    あと・・・、お示し頂いたコードのように、Keyイベントを使ってプログラムを書くところまでやるのであれば、

      そのTextBoxのIMEを強制的にオフにして、

      あと、数字以外のキーが押されたときには処理しない、

    というような書き方もアリかと思います。(私は、この実績あり)

    2008年2月17日 3:43
  •  外池 さんからの引用

      そのTextBoxのIMEを強制的にオフにして、

      あと、数字以外のキーが押されたときには処理しない、

    「数字以外のキーが押されたときには処理しない」だけでなく、クリップボードからの貼り付けも意識しないといけません。

    KeyPressやKeyDownで対策することで直接の入力やCtrl+Vでは貼り付けを封じることができますが、右クリックメニューからの「貼り付け」には効果がありません。

     

    貼り付け処理を封じるなら次のサイトを参考にして下さい。

    http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27392&forum=7&start=0

    2008年2月17日 5:46
    モデレータ
  • 外池です。拙作のコードを読み返してみると・・・、

     

    複雑な(何桁もあって、転記を間違えると痛い)数字の入力を目的にしていたので、逆に、"."、"0~9"及びBackSpace、さらに、Ctfl-X、Ctrl-Y、Ctrl-Vを積極的に許す形になってました。ただし、Validatingで、数値型に変換する(数値型.Parse)際に例外が出たらメッセージを出すようにしてました。

     

    参考になれば幸いです。

     

    2008年2月17日 7:36
  • 皆さん、解答いただき、ありがとうございました。
    どれも大変参考になります。
    勉強させていただきます。
    とりあえず、IsDigitを使った方法で、もう少し研究してみます。
    ありがとうございました。
    2008年2月17日 13:02