トップ回答者
IsDigitとIsNumberの違い。

質問
-
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.KeyCharDebug.WriteLine(Char.IsDigit(s), "IsDigit")
Debug.WriteLine(Char.IsNumber(s), "IsNumber")
End Sub
最終的には、0から9の数字だけを入れるようにしたいのですが、
どちらも同じ結果が返ってくるようです。どこが違うのでしょうか。
また0から9の数字だけを許可する場合、どちらを使う方がより良いのでしょうか。
よろしくお願いいたします。
回答
-
「123」「123」などは、双方ともに True を返します。
「壱弐参」「一二三」などは、双方ともに False を返します。
「ⅠⅡⅢ」「ⅰⅱⅲ」「①②③」「⑽⒑❿➉」などは、IsNumber は True ですが、IsDigit は False です。
どちらを使うべきかは、アプリケーションの仕様によります。たとえば、
「全角を入れられたら、半角に自動補正される」
という、初心者ユーザにも親切なシステムを作りたい場合もあれば、
「全角を入れたらエラーにしなければならない」
という厳密な判断を求められる場合もありますよね。
なお、特定の文字のみを許可したいのであれば、このような書き方もあります。
Code SnippetConst AllowChars As String = "1234567890" '許可したい文字の一覧
Dim c As Char = 検査対象の1文字
If AllowChars.IndexOf(c) < 0 Then
'許可されていない文字
Else
'許可された文字
End If
すべての返信
-
「123」「123」などは、双方ともに True を返します。
「壱弐参」「一二三」などは、双方ともに False を返します。
「ⅠⅡⅢ」「ⅰⅱⅲ」「①②③」「⑽⒑❿➉」などは、IsNumber は True ですが、IsDigit は False です。
どちらを使うべきかは、アプリケーションの仕様によります。たとえば、
「全角を入れられたら、半角に自動補正される」
という、初心者ユーザにも親切なシステムを作りたい場合もあれば、
「全角を入れたらエラーにしなければならない」
という厳密な判断を求められる場合もありますよね。
なお、特定の文字のみを許可したいのであれば、このような書き方もあります。
Code SnippetConst AllowChars As String = "1234567890" '許可したい文字の一覧
Dim c As Char = 検査対象の1文字
If AllowChars.IndexOf(c) < 0 Then
'許可されていない文字
Else
'許可された文字
End If -
外池と申します。
結論は、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を強制的にオフにして、
あと、数字以外のキーが押されたときには処理しない、
というような書き方もアリかと思います。(私は、この実績あり)
-
外池 さんからの引用 そのTextBoxのIMEを強制的にオフにして、
あと、数字以外のキーが押されたときには処理しない、
「数字以外のキーが押されたときには処理しない」だけでなく、クリップボードからの貼り付けも意識しないといけません。
KeyPressやKeyDownで対策することで直接の入力やCtrl+Vでは貼り付けを封じることができますが、右クリックメニューからの「貼り付け」には効果がありません。
貼り付け処理を封じるなら次のサイトを参考にして下さい。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=27392&forum=7&start=0