入力チェック への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2017/6/8 10:11:07
ちょっと気になったので、masaX さんのコードについて追加検証してみました。
コントロールパネルの地域設定に依存する部分もありますが:
ここまでにあった回答以外の手段として、他にも
・正規表現を使った判定方法
・Like 演算子を使った判定方法
・Integer.TryParse を使った上で変換後の値の大小を調べる方法
・MaskedTextBox コントロールを使った入力検査
など、いろいろな方法が考えられます。
処理タイミングについても、キー入力時(KeyPress 等)、テキスト変更時(TextChanged 等)、
入力検証時(Validating 等)、ボタンクリック時(Click 等)と様々ですし、時には、
これらを組み合わせてチェックすることもあります。
「4 桁の数値を得られれば、入力文字列の形式にはこだわらない」のか、
「4 桁の数字(≠数値)で構成された文字列であることを期待する」のか、
最終的に求める処理にあわせて使い分けてみてください。
コントロールパネルの地域設定に依存する部分もありますが:
(a)「1234」 が 1234 に解釈され、4文字扱いになる。(全角文字)
(b)「+5555」 が 5555 に解釈され、4文字扱いになる。(正の符号の先導)
(c)「-987」 が -987 に解釈され、4文字扱いになる。(負の符号の先導)
(d)「(275)」 が -275 に解釈され、4文字扱いになる。(丸括弧による負数表記)
(e)「9753.10」 が 9753 に解釈され、4文字扱いになる。(小数表記)
(f)「1.3579E3」 が 1358 に解釈され、4文字扱いになる。(正数となる指数表記)
(g)「-333333E-3」が -333 に解釈され、4文字扱いになる。(負数となる指数表記)
(h)「&H9A4」 が 2468 に解釈され、4文字扱いになる。(16進数表記)
(i)「&o1750」 が 1000 に解釈され、4文字扱いになる。(8進数表記)
(j)「1,2,34,.56」が 1235 に解釈され、4文字扱いになる。(桁区切り記号)
(k)「\1,234」 が 1234 に解釈され、4文字扱いになる。(通貨記号)
(l)「 5432 」 が 5432 に解釈され、4文字扱いになる。(先導空白あるいは後続空白)
(m)「&H80000000」が 2147483648 に解釈され、CInt 時に OverflowException の例外が発生する。
(n)「-∞」 が Double.NegativeInfinity に解釈され、CInt 時に OverflowException の例外が発生する。
(b)「+5555」 が 5555 に解釈され、4文字扱いになる。(正の符号の先導)
(c)「-987」 が -987 に解釈され、4文字扱いになる。(負の符号の先導)
(d)「(275)」 が -275 に解釈され、4文字扱いになる。(丸括弧による負数表記)
(e)「9753.10」 が 9753 に解釈され、4文字扱いになる。(小数表記)
(f)「1.3579E3」 が 1358 に解釈され、4文字扱いになる。(正数となる指数表記)
(g)「-333333E-3」が -333 に解釈され、4文字扱いになる。(負数となる指数表記)
(h)「&H9A4」 が 2468 に解釈され、4文字扱いになる。(16進数表記)
(i)「&o1750」 が 1000 に解釈され、4文字扱いになる。(8進数表記)
(j)「1,2,34,.56」が 1235 に解釈され、4文字扱いになる。(桁区切り記号)
(k)「\1,234」 が 1234 に解釈され、4文字扱いになる。(通貨記号)
(l)「 5432 」 が 5432 に解釈され、4文字扱いになる。(先導空白あるいは後続空白)
(m)「&H80000000」が 2147483648 に解釈され、CInt 時に OverflowException の例外が発生する。
(n)「-∞」 が Double.NegativeInfinity に解釈され、CInt 時に OverflowException の例外が発生する。
ここまでにあった回答以外の手段として、他にも
・正規表現を使った判定方法
・Like 演算子を使った判定方法
・Integer.TryParse を使った上で変換後の値の大小を調べる方法
・MaskedTextBox コントロールを使った入力検査
など、いろいろな方法が考えられます。
処理タイミングについても、キー入力時(KeyPress 等)、テキスト変更時(TextChanged 等)、
入力検証時(Validating 等)、ボタンクリック時(Click 等)と様々ですし、時には、
これらを組み合わせてチェックすることもあります。
「4 桁の数値を得られれば、入力文字列の形式にはこだわらない」のか、
「4 桁の数字(≠数値)で構成された文字列であることを期待する」のか、
最終的に求める処理にあわせて使い分けてみてください。
投稿者 masaX  (社会人)
投稿日時
2017/6/7 19:35:54
ボタンを押した時の検証で良ければ
低レベルなコードかも知れませんが、単純に
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If IsNumeric(TextBox1.Text) = True Then '入力が数値かどうか?
Dim tx As String = CStr(CInt(TextBox1.Text)) '数値に変換してから文字列に変換(0から始まる文字だった場合を考慮して)
If Len(tx) <> 4 Then '4文字かどうか
MsgBox("4桁の数値を入力してください")
Exit Sub
End If
Else
MsgBox("数値を入力してください")
Exit Sub
End If
MsgBox("OK")
End Sub
こんなのでどうですか?
低レベルなコードかも知れませんが、単純に
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If IsNumeric(TextBox1.Text) = True Then '入力が数値かどうか?
Dim tx As String = CStr(CInt(TextBox1.Text)) '数値に変換してから文字列に変換(0から始まる文字だった場合を考慮して)
If Len(tx) <> 4 Then '4文字かどうか
MsgBox("4桁の数値を入力してください")
Exit Sub
End If
Else
MsgBox("数値を入力してください")
Exit Sub
End If
MsgBox("OK")
End Sub
こんなのでどうですか?
投稿者 魔界の仮面弁士  (社会人)
投稿日時
2017/6/1 11:48:25
TextBox ではなく NumericUpDown を使うようにして、
デザイン時にプロパティ設定を
Maximum = 9999
Minimum = 1000
にしておくという手法もあるかと思います。
この場合、入力された値を
Dim s As String = TextBox1.Text
のかわりに
Dim d As Decimal = NumericUpDown1.Value
で取得できます。
デザイン時にプロパティ設定を
Maximum = 9999
Minimum = 1000
にしておくという手法もあるかと思います。
この場合、入力された値を
Dim s As String = TextBox1.Text
のかわりに
Dim d As Decimal = NumericUpDown1.Value
で取得できます。
投稿者 daive  (社会人)
投稿日時
2017/6/1 10:31:10
>文字列をshift-jisにコード変換してからバイト数を数えればいいかと。
>この考え方はVB6の時代から変わりません。
この考え方は、危険です。
’
Shift_JIS 一つとっても、亜種があり(MS、IBM、Appleなど、汎用機のフォントはメーカ亜種の塊)
油断していると、嵌められます。
古い処では、文字コードとフォントの相対の変更で、籠、篭のコードが変更になったり、
’
98時代の4分1角、2分1角まで考えると、悪夢です。
’
UTF、UNICODEには、Shift-JISに対応しない
文字コードがあり、単純な例では、
Windowsのファイル名としては扱えても、
VB6、VBA6/7のDIR関数では、問題を起こす文字があったりします。
⇒ここ暫くは、悩まされないが、出ると拒否しているのが、外字対応です。
’
私の場合は、現状では、半角カナは使用禁止としています。(2分1角は当然禁止)
― ‐ - なんて Shift-JIS では、ろくに区別しなかったけれど、今では区別します。
>この考え方はVB6の時代から変わりません。
この考え方は、危険です。
’
Shift_JIS 一つとっても、亜種があり(MS、IBM、Appleなど、汎用機のフォントはメーカ亜種の塊)
油断していると、嵌められます。
古い処では、文字コードとフォントの相対の変更で、籠、篭のコードが変更になったり、
’
98時代の4分1角、2分1角まで考えると、悪夢です。
’
UTF、UNICODEには、Shift-JISに対応しない
文字コードがあり、単純な例では、
Windowsのファイル名としては扱えても、
VB6、VBA6/7のDIR関数では、問題を起こす文字があったりします。
⇒ここ暫くは、悩まされないが、出ると拒否しているのが、外字対応です。
’
私の場合は、現状では、半角カナは使用禁止としています。(2分1角は当然禁止)
― ‐ - なんて Shift-JIS では、ろくに区別しなかったけれど、今では区別します。
投稿者 (削除されました)  ()
投稿日時
2017/5/31 11:43:48
(削除されました)
投稿者 金吾中納言  (社会人)
投稿日時
2017/5/31 11:43:45
文字列をshift-jisにコード変換してからバイト数を数えればいいかと。
この考え方はVB6の時代から変わりません。
↓
System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(テキストボックスの値)
VBのデフォルトはuniコードなので、そのままGetByteCountでチェックしても、
1バイト文字も2byteとして計算されます。
この考え方はVB6の時代から変わりません。
↓
System.Text.Encoding.GetEncoding("Shift_JIS").GetByteCount(テキストボックスの値)
VBのデフォルトはuniコードなので、そのままGetByteCountでチェックしても、
1バイト文字も2byteとして計算されます。
投稿者 daive  (社会人)
投稿日時
2017/5/25 17:01:37
検索ワード例
vb.net 2010 textbox validation
↑で、グーグル検索してみて下さい。
Validating 、 Validated を使いたくない場合は、
別な方法もあります。
’
エラーにして、、、
さて、エラー状態が解消されない場合は、どうするんだろう?
元の値に戻すのか、近い範囲で、補正するのか?
UI は、1面だけ見てもダメで、想定範囲内だけではなく、
想定範囲外では、如何あるべき?
から、考慮する必要があります。
vb.net 2010 textbox validation
↑で、グーグル検索してみて下さい。
Validating 、 Validated を使いたくない場合は、
別な方法もあります。
’
エラーにして、、、
さて、エラー状態が解消されない場合は、どうするんだろう?
元の値に戻すのか、近い範囲で、補正するのか?
UI は、1面だけ見てもダメで、想定範囲内だけではなく、
想定範囲外では、如何あるべき?
から、考慮する必要があります。
投稿者 fd  (高校生)
投稿日時
2017/5/25 14:48:49
vb2010
テキストボックスとボタンがあります。
テキストボックスに数字を入力してボタンを押下したら
テキストボックスに入力した数値が4桁ではない場合
エラーにしたいのですが調べても分かりません
良かったら教えていただきたいです。
テキストボックスとボタンがあります。
テキストボックスに数字を入力してボタンを押下したら
テキストボックスに入力した数値が4桁ではない場合
エラーにしたいのですが調べても分かりません
良かったら教えていただきたいです。
ありがとうございます。
なるほど、この単純なコードでは間違った検証をしてしまう場合が多いですね(汗)
勉強になりました。