C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

VB,NET2013で 数値と英文字を区別したい /年寄プログラマー (20/10/07(Wed) 20:31) #95892
Re[1]: VB,NET2013で 数値と英文字を区別したい /魔界の仮面弁士 (20/10/07(Wed) 21:28) #95895
│└ Re[2]: VB,NET2013で 数値と英文字を区別したい /年寄プログラマー (20/10/07(Wed) 21:53) #95897
│  ├ Re[3]: VB,NET2013で 数値と英文字を区別したい /魔界の仮面弁士 (20/10/08(Thu) 01:06) #95898
│  │└ Re[4]: VB,NET2013で 数値と英文字を区別したい /ぶなっぷ (20/10/08(Thu) 09:24) #95901
│  └ Re[3]: VB,NET2013で 数値と英文字を区別したい /大谷刑部 (20/10/08(Thu) 10:12) #95904
Re[1]: VB,NET2013で 数値と英文字を区別したい /WebSurfer (20/10/08(Thu) 10:15) #95905
Re[1]: VB,NET2013で 数値と英文字を区別したい /大谷刑部 (20/10/08(Thu) 10:54) #95907
Re[1]: VB,NET2013で 数値と英文字を区別したい /魔界の仮面弁士 (20/10/09(Fri) 10:50) #95918
  ├ Re[2]: VB,NET2013で 数値と英文字を区別したい /大谷刑部 (20/10/09(Fri) 11:49) #95919
  │└ Re[3]: VB,NET2013で 数値と英文字を区別したい /魔界の仮面弁士 (20/10/09(Fri) 12:25) #95920
  │  └ Re[4]: VB,NET2013で 数値と英文字を区別したい /大谷刑部 (20/10/09(Fri) 14:07) #95925
  └ Re[2]: VB,NET2013で 数値と英文字を区別したい /魔界の仮面弁士 (20/10/12(Mon) 17:26) #95951
    └ Re: VB,NET2013で 数値と英文字を区別したい /pixer (20/10/13(Tue) 09:54) #95953
      └ Re[4]: Re: VB,NET2013で 数値と英文字を区別したい /年寄プログラマー (20/10/13(Tue) 19:52) #95970 解決済み


親記事 / ▼[ 95895 ] ▼[ 95905 ] ▼[ 95907 ] ▼[ 95918 ]
■95892 / 親階層)  VB,NET2013で 数値と英文字を区別したい
□投稿者/ 年寄プログラマー (2回)-(2020/10/07(Wed) 20:31:35)

分類:[.NET 全般] 

vb,net 2013で アルファベットと 数字の判別をしたいのですが
上手くいきません。
どなたか、ご教授をお願いします

Dim www As String
www = "12"
If Char.IsNumber(www, 2) Then
MessageBox.Show("数字です")
Else
MessageBox.Show("違う")
End If


'指定された引数は、有効な値の範囲内にありません。 になります
import しなければなりませんか?
[ □ Tree ] 返信 編集キー/

▲[ 95892 ] / ▼[ 95897 ]
■95895 / 1階層)  Re[1]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 魔界の仮面弁士 (2858回)-(2020/10/07(Wed) 21:28:28)
No95892 (年寄プログラマー さん) に返信
> If Char.IsNumber(www, 2) Then

文字 (Char) に対する判定をしたいのでしょうか。
文字列 (String) に対する判定処理をお望みでしょうか。


> MessageBox.Show("数字です")

数字 (数を表す文字) かどうかの判定が必要なのでしょうか。
数値に変換可能な文字列かどうかの判定が必要なのでしょうか。

たとえば前者には、ローマ数字やアラビア数字や漢数字などか含まれるでしょう。
後者には、整数表記、小数表記、指数表記、8進数表記などがありそうです。

たとえば文字列を数値に変換することが目的なら、TryParse メソッドを使うのが良いでしょう。

http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30554#CommentId84228


> MessageBox.Show("違う")

数字だけで構成された文字列と
数字と数字以外が混在した文字列と
数字を全く含まない文字列と
長さ 0 の空文字列と、
Nothing 状態の文字列とを
それぞれ区別する必要はありますか?
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95895 ] / ▼[ 95898 ] ▼[ 95904 ]
■95897 / 2階層)  Re[2]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 年寄プログラマー (3回)-(2020/10/07(Wed) 21:53:18)
No95895 (魔界の仮面弁士 さん) に返信
アルファベットと数字を区別し、異なる処理をしたいと考えています
確認するのは2文字で空きはふくまれません
英数字は混在しません
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95897 ] / ▼[ 95901 ]
■95898 / 3階層)  Re[3]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 魔界の仮面弁士 (2859回)-(2020/10/08(Thu) 01:06:53)
No95897 (年寄プログラマー さん) に返信
> アルファベットと数字を区別し、異なる処理をしたいと考えています
> 確認するのは2文字で空きはふくまれません
> 英数字は混在しません

これでどうでしょう?

Public Function 判定処理(文字列 As String) As String
 If 文字列 Like "[A-Za-z][A-Za-z]" Then
  Return "アルファベット2文字"
 ElseIf 文字列 Like "[0-9][0-9]" Then
  Return "数字2文字"
 Else
  Throw New ArgumentOutOfRangeException()
 End If
End Function

[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95898 ] / 返信無し
■95901 / 4階層)  Re[4]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ ぶなっぷ (247回)-(2020/10/08(Thu) 09:24:51)
とりあえず、以下の原因です。
> '指定された引数は、有効な値の範囲内にありません。 になります

www = "12" なので、
If Char.IsNumber(www, 2) Then は、
www文字列の末尾をはみ出しています。

なので、ArgumentOutOfRangeException例外が発生して、
画面上は「指定された引数は、有効な値の範囲内にありません。」となります。

さて、修正方法ですが、
まず、Char.IsNumber(string s, int index) の仕様を正しく理解しておられます
でしょうか?

s文字列の先頭から index + 1 番目の文字(1文字)が数字であるかを検証するもの
です。

なので、同メソッドを使って正確に判定するなら、文字列内を全探査する必要が
あります。
  For index As Integer = 0 To s.Length
    If Char.IsNumber(www, index) Then
      : (以下略)
  Next

ただし、
> 確認するのは2文字で空きはふくまれません
> 英数字は混在しません
というなら、先頭の1文字だけで検証しちゃってもよいのでは?
であれば、
  If Char.IsNumber(www, 0) Then
      : (以下略)

そんな感じかなと。

[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95897 ] / 返信無し
■95904 / 3階層)  Re[3]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 大谷刑部 (108回)-(2020/10/08(Thu) 10:12:39)
No95897 (年寄プログラマー さん) に返信
> ■No95895 (魔界の仮面弁士 さん) に返信
> アルファベットと数字を区別し、異なる処理をしたいと考えています
> 確認するのは2文字で空きはふくまれません
> 英数字は混在しません

であれば、IsNumeric関数が一番無難な気がします。
TryParseでもチェックの役目を果たしますが、一旦型変換してエラーになるものをFalseにするメソッドなので、
個人的にはあまりお勧めしません。

ちなみに、全角数字はあり得ますか?
全角数字の場合、IsNumericはTrue、TryParseはFalseとなるので、微妙に仕様が違う感じにはなります。
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95892 ] / 返信無し
■95905 / 1階層)  Re[1]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ WebSurfer (2111回)-(2020/10/08(Thu) 10:15:00)
No95892 (年寄プログラマー さん) に返信

Char.IsNumber メソッド (Char) は、

"有効な数値は、UnicodeCategory のカテゴリ DecimalDigitNumber、LetterNumber、または OtherNumber のメンバです。"

とのことなので、期待してない文字も含まれてしまうかも。試してはいないのでハズレだったらすみません。


List of Unicode Characters of Category “Letter Number”
https://www.compart.com/en/unicode/category/Nl

List of Unicode Characters of Category “Other Number”
https://www.compart.com/en/unicode/category/No

正規表現の [0-9] とかを使うのが正解だとい思います。
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95892 ] / 返信無し
■95907 / 1階層)  Re[1]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 大谷刑部 (109回)-(2020/10/08(Thu) 10:54:19)
No95892 (年寄プログラマー さん) に返信
> '指定された引数は、有効な値の範囲内にありません。 になります
> import しなければなりませんか?
第2引数の意味を誤解しているからですね。
「インデックス」なので1でなく0始まりです。
したがって、2文字を判定すればいいのであれば1に変えればいいだけの話ですが、2文字丸ごと判定したいのであれば、
Char.IsNumberだと2回ループさせなきゃいけないことになります。
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95892 ] / ▼[ 95919 ] ▼[ 95951 ]
■95918 / 1階層)  Re[1]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 魔界の仮面弁士 (2863回)-(2020/10/09(Fri) 10:50:38)
2020/10/09(Fri) 10:51:49 編集(投稿者)

No95892 (年寄プログラマー さん) に返信
> www = "12"
> If Char.IsNumber(www, 2) Then

Char.IsNumber は「Char(文字)」単位で調べる物であり、
「String(文字列)」のためのものではありません。


Char.IsNumber を使うなら、たとえばこのように書くことができます。

If String.IsNullOrEmpty(www) Then
  MessageBox.Show("文字列が空です。")
ElseIf www.All(AddressOf Char.IsNumber) Then
  MessageBox.Show("すべて数字で構成されています。")
Else
  MessageBox.Show("数字以外の文字が含まれています。")
End If


ただし、 WebSurfer さんが指摘されている理由により、
 www = "V2"
も数字のみという扱いになることに注意が必要です。




No95904 (大谷刑部 さん) に返信
>>アルファベットと数字を区別し、異なる処理をしたいと考えています
>>確認するのは2文字で空きはふくまれません
>>英数字は混在しません
> であれば、IsNumeric関数が一番無難な気がします。

お手軽ではありますが、この手のチェックで IsNumeric を使うのは悪手かも。

https://twitter.com/Benshi_Orator/status/1314366084921716736
http://www.synapse.ne.jp/anko/VbIsnumeric.html
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95918 ] / ▼[ 95920 ]
■95919 / 2階層)  Re[2]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 大谷刑部 (111回)-(2020/10/09(Fri) 11:49:51)
No95918 (魔界の仮面弁士 さん) に返信
> 2020/10/09(Fri) 10:51:49 編集(投稿者)
> ■No95904 (大谷刑部 さん) に返信
> >>アルファベットと数字を区別し、異なる処理をしたいと考えています
> >>確認するのは2文字で空きはふくまれません
> >>英数字は混在しません
>>であれば、IsNumeric関数が一番無難な気がします。
>
> お手軽ではありますが、この手のチェックで IsNumeric を使うのは悪手かも。
>
> https://twitter.com/Benshi_Orator/status/1314366084921716736
> http://www.synapse.ne.jp/anko/VbIsnumeric.html

おっしゃってることはわかりますが全角数字やカンマ編集、小数をTrueとみなすのを悪とするかどうかの問題ですね。
これが画面入力でLeaveイベントでカンマ編集した数値を数値として判定したい場合にはinteger.TryParseだと上記がすべてFalseになっちゃうので使いづらいですね。
私はどちらかというとKeypressとかで全角入力抑止して(場合によっては英字も)、入力チェックは業務的な論理チェックのみに極力する派ですが。
このスレの質問者さんの要件はそういう想定じゃなさそう(カンマや.の入力が考えにくい)だから多分どっちでもよくて、好みの問題ということになるのでしょうけど。


[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95919 ] / ▼[ 95925 ]
■95920 / 3階層)  Re[3]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 魔界の仮面弁士 (2864回)-(2020/10/09(Fri) 12:25:37)
No95919 (大谷刑部 さん) に返信
> おっしゃってることはわかりますが全角数字やカンマ編集、小数をTrueとみなすのを悪とするかどうかの問題ですね。

たとえば、半角アルファベットのみの文字列であったとしても、
IsNumeric("NaN") は True を返します。


マルチポスト先も含め、今回の最初の質問は「アルファベットと 数字の判別」という
内容であったことから、IsNumeric に頼ることは危険であると判断致しました。


No95897 で常時 2 文字制限が追加されたとはいえ、将来的に 3 文字に仕様拡張されたら、
この問題が見過ごされてしまう可能性が高いでしょう。
こうした気付きにくい問題を幾つか抱えているため、やはり個人的にはお奨めしません。


文字数チェックや文字種の判定も同時に行えることを考えれば、
最初から正規表現を使った方が確実ですし、スマートだと思います。

正規表現クラスを使うのが煩わしいということであれば、『Like 演算子』を使うことができます。
(Like もカルチャ依存問題があるので完全ではないですが)
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95920 ] / 返信無し
■95925 / 4階層)  Re[4]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 大谷刑部 (112回)-(2020/10/09(Fri) 14:07:28)
No95920 (魔界の仮面弁士 さん) に返信
> ■No95919 (大谷刑部 さん) に返信
>>おっしゃってることはわかりますが全角数字やカンマ編集、小数をTrueとみなすのを悪とするかどうかの問題ですね。
>
> たとえば、半角アルファベットのみの文字列であったとしても、
> IsNumeric("NaN") は True を返します。
仕様的に間違いじゃないですよね。
0除算の時とかにしか出てこない問題をケアする必要は私はないと思います。
質問者さんのプログラムの入力が何かはわかりませんが、仮にCSV等のファイルだったと仮定すると、
その時点で、0除算等が発生してる方が仕様的に問題です。

> No95897 で常時 2 文字制限が追加されたとはいえ、将来的に 3 文字に仕様拡張されたら、
> この問題が見過ごされてしまう可能性が高いでしょう。
> こうした気付きにくい問題を幾つか抱えているため、やはり個人的にはお奨めしません。
確かに偶然「NaN」という3文字のコードがシステム的に存在してるならそれをケアする必要はありますが、
少なくとも業務アプリでそれはあまり考えづらいですね。
システムで特別な意味を持つ文字列をコードとして使うコード体系のシステムが。

> 文字数チェックや文字種の判定も同時に行えることを考えれば、
> 最初から正規表現を使った方が確実ですし、スマートだと思います。
そうですか?
若い人とか正規表現自体知らない人も多いですよ。
正規表現を使わないと絶対にできないチェックならそうしますが、
結構現場では新人でもメンテできるロジックというのが求められることも多く、正規表現はベテランにとっては確かに便利ですが、
スマートと言えるかは微妙と思います。

質問者置いてきぼりでこれ以上議論するのも不毛なので、この辺でやめましょう。
質問者さんの結論を待ちましょう。
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95918 ] / ▼[ 95953 ]
■95951 / 2階層)  Re[2]: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 魔界の仮面弁士 (2870回)-(2020/10/12(Mon) 17:26:06)
No95918 (魔界の仮面弁士) に追記
> Char.IsNumber を使うなら、たとえばこのように書くことができます。
> ただし、 WebSurfer さんが指摘されている理由により、
>  www = "V2"
> も数字のみという扱いになることに注意が必要です。

Char.IsNumber と似たものとして、
Char.IsDigit というものもあります。違いについては下記をご覧ください。
https://www.atmarkit.co.jp/fdotnet/dotnettips/264checkdigit/checkdigit.html


あとはこのあたりも参考になるかと思います。
https://dobon.net/vb/dotnet/vb2cs/isnumeric.html


もしも「数字のみで構成されているかどうか」という視点ではなく、
「半角アルファベットのみで構成されているかどうか」という点から
検査するのであれば、Like 演算子または正規表現の利用をおすすめします。
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95951 ] / ▼[ 95970 ]
■95953 / 3階層)  Re: VB,NET2013で 数値と英文字を区別したい
□投稿者/ pixer (1回)-(2020/10/13(Tue) 09:54:01)
2020/10/13(Tue) 09:57:28 編集(投稿者)

一応、評価対象が2文字の文字列で、英数混合はなく、スペース埋めもないとして、
・数字は整数か
・半角のみか、全角も許すか
・数字とそれ以外の判断でよいか
によっても対応方法(それに応じたコスト)が変わります。
とりあえず、質問者に説明してもらいましょう。

僕なら、「数字は整数で、半角のみで、数字とそれ以外の判断でよい」ならば、
正規表現"^[0-9]+$"でやっちゃうかも知れません。
(全角を許すなら"^\d+$"かな?)
#「コスト」と言っている割に、コストの高い正規表現を選ぶ僕。。。
[ 親 95892 / □ Tree ] 返信 編集キー/

▲[ 95953 ] / 返信無し
■95970 / 4階層)  Re[4]: Re: VB,NET2013で 数値と英文字を区別したい
□投稿者/ 年寄プログラマー (6回)-(2020/10/13(Tue) 19:52:12)
ご教授ありがとうございました
上手くいきました
しかし今更ですがVB.NETは同じようで微妙に異なる
命令が多くありますな!
私の様な年寄にはちと難しい
解決済み
[ 親 95892 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -