外出自粛中でも楽しく過ごす!QAまとめ>>

Visual Studio2010初心者です。C#で学習しています。

テキストボックスに入力された値が数字(0~9)かそうじゃないか判定をしたいです。

テキストボックスに文字が入力されたらエラーとして検知したいのですが、どのように処理をすればよろしいでしょうか?

ネットで調べるとTryParseメソッドでできるみたいですが、よくわかりません・・・

よろしくお願いします。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

#2のかたの回答でよいかと思いますが、一点、気になり投稿しました。


それは、「入力された値が数字(0~9)かそうじゃないか判定」の意味が、
例えば以下のような値をOKとするかどうかです。
(1) +12345       ・・・先頭に+の符号付
(2) -12345       ・・・先頭に-の符号付
(3) 12345678901     ・・・11桁の数字

(1)、(2)は、int.TryParseを使用するとOK(数字)となります。
(3)は、int.TryParseを使用するとNG(数字以外)となります。
もし、上記の結果があなたの望んだ結果出れば、特に問題ありません。(以降は読み捨ててください)

しかしながら、数字(0~9)かどうかの観点で考えると、(1)(2)はNGであり、(3)はOKとなります。
もし、(1)(2)をNGとし(3)をOKとしたいなら、int.TryParseを使用してはいけません。
そもそも、int.TryParseは、文字列をint型の整数に変換できるか否かのチェックをおこなう機能です。
従って、+12345は、正の12345であり、-12345は負の12345の為、int型の数値に変換可能です。
12345678901は、11桁の数字の為、int型の整数に変換できません。
int型整数が格納できる数値の範囲は、-2147483648~+2147483647です。
従って、11桁の数字は格納できないため、TryParseでエラーとなります。

では、(1)(2)をNGとし(3)をOKとする為には、どうするかというと、
#1のかたのように正規表現を使用します。以下、正規表現を使用したコードです。
-------------------------------------
Regex reg = new Regex(@"^\d+$");
string str = "+12345";
bool ui = reg.IsMatch(str);
if (ui == true)
{
Console.WriteLine("<"+str+">OK");
}
else
{
Console.WriteLine("<"+str+">NG");
}
str = "12345678901";
ui = reg.IsMatch(str);
if (ui == true)
{
Console.WriteLine("<"+str+">OK");
}
else
{
Console.WriteLine("<"+str+">NG");
}
-------------------------------------
実行結果
<+12345>NG
<12345678901>OK
上記の正規表現は、文字列が数字(0~9)のみで構成され(+,-はNG)、
数字が1文字以上であれば、OKとなります。(何桁であってもOKです)
    • good
    • 0
この回答へのお礼

+、-のことは全く考えていませんでした。入力文字は8文字に制限しようとおもっていたので、桁オーバーの心配はないのですが、桁オーバーの事は全く意識していませんでした。

お教え頂きました方法は目からうろこです。大変勉強になります。感謝です。ありがとうございます。

お礼日時:2013/12/26 16:56

TryParseに関して補足します。


こちら(↓)にも説明がありますが……
http://msdn.microsoft.com/ja-jp/library/f02979c7 …

TryParseの戻り値をチェックすることで、整数判定を行うことができます。
出力用の変数は必要ですが、Try~Catchを使わなくて済むのでコードが見やすくなることがあります。


int result = -1;
string input;

input = "12345";
if(int.TryParse(input, out result)){
  Console.WriteLine("'{0}' is a number", input);
}else{
  Console.WriteLine("'{0}' is not a number", input);
}
Console.WriteLine("result = {0}", result);

input = "abcde";
if(int.TryParse(input, out result)){
  Console.WriteLine("'{0}' is a number", input);
}else{
  Console.WriteLine("'{0}' is not a number", input);
}
Console.WriteLine("result = {0}", result);

/*
* 実行結果:
* '12345' is a number
* result = 12345
* 'abcde' is not a number
* result = 0
*/
    • good
    • 0
この回答へのお礼

お教え頂きましたTryParseでできました!ありがとうございます。コードまでお教え頂き大変助かりました。

お礼日時:2013/12/25 09:59

fflashingさん


こんにちは。

私はVB.NETは知っていますが、C#は詳しくは知りません。
しかし基本大差はないので、一応回答させて頂きます。
※C#の構文を知らないので間違っていたら訂正して下さい。

1.通常、文字のチェックは正規表現で行った方が良いと思います。
 例)VB.NET
   Dim num As String = "100.9"
   If System.Text.RegularExpressions.Regex.IsMatch(num, "^\d+$") Then
    MsgBox("数字です。")
   Else
    MsgBox("数字以外が入っています。")
   End If
 例)C#
   string number = "123456";
   if (System.Text.RegularExpressions.Regex.IsMatch(num , @"^\d+$"))
   {
  Console.WriteLine("数字です。");
   }
   else
   {
    Console.Write("1/{0} = {1}", x, x_inv);
 }

2.TryParseで行う?
  試しましたが数字チェックは無理なようです。
  数字エラーの場合結果をいつも0になるだけのようです。
  ※VB.NETで試した結果ですが…

3.Parse命令でTry&Catchで行う
 例)VB.NET
   Dim num As String = "100.9"
   Dim i As Integer
   Try
    i = Int32.Parse(num)
    MsgBox("数字です。")
   Catch
    MsgBox("数字以外が入っています。")
   End Try
 例)C#
    string num = "this is not a number";
    int i;
    try {
     i = Int32.Parse(num);
 Console.WriteLine("数字です。");
  } catch {
 Console.WriteLine("数字以外が入っています。");
 }
    • good
    • 0
この回答へのお礼

正規表現でのチェック。思いつきませんでした。テキストエディタで正規表現はよく使うのですが、.NETプログラムで使ったことがありませんでした。勉強になります。正規表現が使えれば文字のチェックも柔軟にできるので今後私の助けになってくれると思います。ありがとうございます!

お礼日時:2013/12/25 10:00

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QTextBoxに半角数字のみの入力しかできないようにしたい

タイトルどおりです。
フォームに貼り付けた、TextBoxに、半角数字のみしか入力できないようにしたいです。
000000~999999までのコード(数字)を入力させるようにするわけですが、そのままだと半角英数も全角も入力できてしまいます。

GrapeCity社製のカスタムコントロール「InputMan」の“Number”を用いると簡単なのですが、これだとカーソルがボックス内の右端にきて、一の位から入力が始まってしまいます。
数字は、ボックス内の左側から入力されていくようにしたいのですが、“Number”だとなんか出来なさそう・・・?
(“Number”で左側から入力できるならそれがいいのですが)

そこで、TextBoxを使うことにしたのですが、TextBoxだと、半角数字のみしか入力できないような制限がかけるのかが、わかりません。

もし、お分かりの方がいらっしゃいましたら、ご教授下さいませ。

Aベストアンサー

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ' Ctrl + V
Case &H18 ' Ctrl + X
Case &H1A ' Ctrl + Z
Case Else
KeyAscii = 0
End Select
End Sub

で、いかがでしょうか。

コピペですみません。
VB6だと、

Private Sub TextBox_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case vbKeyBack, Asc("0") To Asc("9"), Asc("-"), Asc(".")
Case &H1 ' Ctrl + A
TextBox.SelStart = 0
TextBox.SelLength = Len(TextBox.Text)
Case &H3 ' Ctrl + C
Case &H16 ...続きを読む

Q数字以外の入力をエラーにするには?

分からないのでよろしくお願いします。

テキストボックスに一つでも数字以外の文字を入力したらエラーメッセージを出すようにしたいのです。小数点も不可にしたいです。
つまり、整数だけを許可したいです。
Dim suuji As string
suuji= text1.Text
If Not IsNumeric(CStr(suuji.ToString)) Then
MsgBox("入力値が数字ではありません", MsgBoxStyle.Critical, "エラー")
Exit Sub
End If
こうしたのですが、小数点は通ってしまいます。
どうすればいいかご存知の方、教えてください。

Aベストアンサー

' 数字か?
If IsNumeric(CStr(suuji.ToString)) Then
 ' ピリオドが含まれるか?
 If InStr(suuji,".") > 0 then
  MsgBox("入力値が数字ではありません", MsgBoxStyle.Critical, "エラー")
 End If
Exit Sub

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QForm間の値の渡し方

1つのForm上のコマンドボタンで別のFormを表示、そこで変数に値を入れ、そのFormを閉じ、元のFormでその変数を使いたいのですが、どうもうまくいきません。
実施したやり方は、一方のFormの宣言領域で、”Public abc As String”を宣言、両方のFormの(変数に値を入れた方と変数を使う方の)プロシージャーの宣言では引数として(abc As String)と記述しました。
因みに、両プロシージャーともイベントプロシージャーです。何か基本的なことができていないのだとは思いますが、どなたか教えていただけませんか?よろしくお願いします。

Aベストアンサー

すでに何件か回答があがっていますので、少し変わった方法をご参考までに。

あまり使われませんが、Formにはtagというプロパティがあります。
これは「文字列形式であれば何でも格納できる」という、上手く使えば便利なプロパティです。

FormAからFormBを呼び出し、FormBで変更した値をFormA.tagにセットします。
ここでFormBをUnloadしてもFormA.tagの値は影響を受けないので自由に使えます。

複数の値を呼び出し元に戻してやる場合に、区切り文字(カンマなど)で連結した文字列をtagに格納し、呼び出し元で区切り文字でsplitして、複数の値を受け渡すという手法をよく使っています。

Q【VB】コンボボックスにデータベースから取り出した値を入れたい

VB2005です。

表題の通りですがやり方がよくわかりません。
データベースに接続し、
SQLで重複しない値を取り出すところまではできています。

SQL=SELECT DISTINCT FieldName FROM TableName

VB6の時はこんなソースでした
Do Until rs.EOF
   Combo1.AddItem.Fields("FieldName")
   rs.MoveNext
Loop

VB2005ではどう書くのでしょう?
よろしくご教授ください。

Aベストアンサー

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}", dbFilePath)
  Dim sql As String = "SELECT DISTINCT FieldName FROM TableName"
  Dim conn As New OleDbConnection(connectionString)
  Dim query As New OleDbCommand(sql, conn)

  Try
    conn.Open()
    Dim reader As OleDbDataReader = query.ExecuteReader()
    While (reader.Read())
      Me.ComboBox1.Items.Add(reader.Item("FieldName"))
    End While
    reader.Close()
  Catch ex As Exception
    MessageBox.Show(ex.Message)
  Finally
    conn.Close()
  End Try

DataReaderを使用したサンプルです
※DBMSが記述されていないので、接続文字列はアクセスの場合です
※テキスト書きなので試験していません
※DataSetを使用する方法もありますが、コンボボックスに表示する程度ならDataReaderで大丈夫でしょう
※VB2005ならば、TableAdapterという便利なクラスがあるそうです
※VisualStudio2005 まださわってません orz

  Dim dbFilePath As String = "C:\testdb.mdb"
  Dim connectionString As String = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Sourc...続きを読む

QVB.NET テキストボックスの入力チェック

Visual Basic 2008 に関する質問です。

画面のテキストボックスの入力値をチェックする処理として、
Validatingイベントを使用しています。

例えば、
画面上に配置しているボタンをクリックして画面を閉じさせたい場合(Application.Exit()等)、
テキストボックスの値が未入力であると、上記の入力チェックが先にはしってしまい、
画面を閉じることができません。

閉じるボタンの処理を最優先させる方法について、
どなたかご教授いただけませんでしょうか?

(※初歩的なご質問で大変申し訳ございません。)

Aベストアンサー

Formにテキストボックス1つボタン1ツ貼り付け。
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub ClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, Button1.Click
'MsgBox(CType(sender, System.Windows.Forms.TextBox).Name & "clich")
MsgBox(sender.Name & " が click")
If sender.Name = "Button1" Then
MsgBox("フォームを閉じる")
Me.Close()
Exit Sub
End If
If sender.Name = "TextBox1" Then
'MsgBox("文字チェック")
End If

End Sub
End Class
を作る。
これでは見当外れでしょうか。
質問の主旨に沿って居るか自信がないですが
イベントTextBox1.TextChangedとButton1.Click
を1箇所にまとめています。
http://www.atmarkit.co.jp/fdotnet/vb6tonet/vb6tonet25/vb6tonet25_01.html参考
そしてIf sender.Name = "Button1" Then
を先行させています。

Formにテキストボックス1つボタン1ツ貼り付け。
Public Class Form1
Inherits System.Windows.Forms.Form
Private Sub ClickHandler(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, Button1.Click
'MsgBox(CType(sender, System.Windows.Forms.TextBox).Name & "clich")
MsgBox(sender.Name & " が click")
If sender.Name = "Button1" Then
MsgBox("フォームを閉じる")
Me.Close()
...続きを読む

QTextBoxでEnterキーを押すと、にあるButtonを押したのと同じ効果を出す方法

VB初心者です。
まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。

環境はVisualBasic .net 2003です。

フォームにテキストボックス(TextBox)とボタン(Button)があります。
テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。
VC++6.0だと、SendMessage(WM_COMMAND , .....
のようなやり方でできたはずですが・・・
---------------------------
テキストボックスのコード
Private Sub txtTest_KeyDown(ByVal sender As Object, _
ByVal e As System.Windows.Forms.KeyEventArgs) Handles txtTest.KeyDown
If (e.KeyCode = Keys.Enter) Then
'★★★ここでどういうコードを書いてよいかわかりません。
End If
End Sub
----------------------------
ボタンを押したときのイベントハンドラ
Private Sub btnTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnTest.Click
    ボタンを押したら、このイベントハンドラを呼び出したい。
    もしくは、間接的に呼び出したい。
-------
どなたか、やり方をご存知の方がいらっしゃいましたら、よろしくお願いします。

VB初心者です。
まだ、はじめたばかりなので、上手く質問を説明できませんが、よろしくお願いします。

環境はVisualBasic .net 2003です。

フォームにテキストボックス(TextBox)とボタン(Button)があります。
テキストボックス内でEnterキーを押すと、ボタン(Button)を押したのと同様の効果をだしたいのですが。
VC++6.0だと、SendMessage(WM_COMMAND , .....
のようなやり方でできたはずですが・・・
---------------------------
テキストボックスのコード
Private Sub txtTest_KeyDown(ByVal ...続きを読む

Aベストアンサー

>SendMessage(WM_COMMAND
とは、多少意味合いが異なりますが。。。

btnTest.PerformClick()
と行うと、btnTestオブジェクトと関連付いたイベントハンドラが起動します。
http://okwave.jp/kotaeru.php3?q=1688744


また、エンターキーの動きに限るのであれば、フォームのAcceptButtonプロパティを利用すると、コーディングが不要です。ついでにエスケープにも動作を持たせたいのであれば、CancelButtonプロパティを利用するといいです。



どうしてもCと全く同様に、イベントを起こすのであれば、Cと同じ手続きでAPIで起こせばよいと思います。
http://okwave.jp/kotaeru.php3?q=199357


Public Class Form1
  Inherits System.Windows.Forms.Form

  Private Declare Auto Function SendMessage Lib "user32" ( _
    ByVal hWnd As Integer, _
    ByVal wMsg As Integer, _
    ByVal wParam As Integer, _
    ByVal lParam As Integer _
  ) As Integer
  Private Declare Auto Function GetDlgCtrlID Lib "user32" ( _
    ByVal hWnd As Integer _
  ) As Integer

  Private Const WM_COMMAND As Integer = &H111
  Private Const BN_CLICKED As Integer = &H0

#Region " Windows フォーム デザイナで生成されたコード "
#End Region

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    btnTest.PerformClick()
    SendMessage( _
      Me.Handle.ToInt32, _
      WM_COMMAND, _
      BN_CLICKED * GetDlgCtrlID(btnTest.Handle.ToInt32) * &H10000, _
      btnTest.Handle.ToInt32 _
    )
  End Sub
End Class

>SendMessage(WM_COMMAND
とは、多少意味合いが異なりますが。。。

btnTest.PerformClick()
と行うと、btnTestオブジェクトと関連付いたイベントハンドラが起動します。
http://okwave.jp/kotaeru.php3?q=1688744


また、エンターキーの動きに限るのであれば、フォームのAcceptButtonプロパティを利用すると、コーディングが不要です。ついでにエスケープにも動作を持たせたいのであれば、CancelButtonプロパティを利用するといいです。



どうしてもCと全く同様に、イベントを起こすのであれば、...続きを読む

QC# ログイン画面からメイン画面への画面遷移について

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示することがある為)

---------------------------------------------------------------------
private void LoginButton_Click(object sender, EventArgs e)
{
   /* ログイン処理 */

   //ログイン成功時
   //メイン画面インスタンス生成
   MainForm mainForm = new MainForm();
   //ログイン画面インスタンスを代入
   mainForm.loginForm = this;
   //メイン画面表示
   mainForm.Show();
   //ログイン画面非表示
   this.Visible = false;
}
---------------------------------------------------------------------

また上記の方法だとメイン画面を閉じても、アプリケーションは終了しない為
メイン画面の閉じるボタンを押した場合に以下の処理を行っています。

---------------------------------------------------------------------
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
   //ログイン画面クローズ
   loginForm.Close();
}
---------------------------------------------------------------------

以上、宜しくお願いします。

C# ログイン画面からメイン画面への画面遷移について

C#での画面遷移に関する質問です。
ログイン画面からメイン画面に遷移する場合、どの様な方法で遷移すれば良いのか
迷っています。

現状では以下の方法で遷移していますが、より適切な方法をご存じの場合
ご教示下さい。

(1)Program.csにおいてApplication.Run(new LoginDialog())で
ログイン画面を表示

(2)ログインボタンクリックメソッドでログイン成功時、
メイン画面インスタンスを生成・表示し、ログイン画面を非表示。
(後でログイン画面を再表示す...続きを読む

Aベストアンサー

#2です。
最初にログイン画面のみを表示したいなら
メイン画面のForm_menu_Load(loadイベント処理)
の中で、ログイン画面をモーダル表示し、
NGならメイン画面のcloseのほうがよいかも知れません。

QC#でTextBoxに数値のみ入力可能とする方法

C#の超初心者です。C#.NETでWindows環境下でプログラム開発を行っています。TextBoxで数値のみ入力可能にする方法を教えてください。

Aベストアンサー

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
if(!('0' <= e.KeyChar && e.KeyChar <= '9'))
e.Handled=true;
}
keyPressイベントで
Handled に true を設定すれば、キャンセルできます。
小数点のチェックを入れる場合は、チェックをもう少し考えないといけません


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報