質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

7509閲覧

BMI テキストボックスを小数点第一位まで入力を可能にする (小数点第二位からは入力させない)

xlostdjx

総合スコア39

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2018/05/28 08:42

編集2018/05/30 02:02

C#

1答えのあったページからコピペをし、変数などを揃えてビルドしても小数点が制御できません。 2エラーもないのでどこがわるいのかわからなく困っています。 3 4コード**** 5 6 // 数値のみ小数点第一位まで入力が可能であること。 7 //---------------------------------------------------------------------------------------- 8 9 10 11 12      //身長のテキストボックス入力時 13 private void textHeight_KeyPress(object sender, KeyPressEventArgs e) 14 { 15 16 //.KeyChar = 押されたキーに対応する文字を取得または設定します。 17 //数値と小数点とバックスペース以外の入力は不可 18 if ((e.KeyChar < '0' || e.KeyChar > '9') && e.KeyChar != '\b' && e.KeyChar != '.') 19 { 20 21 //.Handled = 取得またはを示す値を設定するかどうか、 KeyPress イベントが処理します。 22 e.Handled = true; 23 //e.Handled = Trueと入れると、キャンセルできる。 24 } 25 } 26 27 28 29 /*イベントが呼び出される順番が KeyDown→TextChanged→KeyUp なので 30  KeyDownイベントを使用します。*/ 31 32 33 //DeleteキーやBackSpaceが押されたかどうかを判断。 34 bool isDelete = false; 35 36 private void textHeight_KeyDown(object sender, KeyEventArgs e) 37 { 38 isDelete = (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back); 39 } 40 41 42 43 44 45 46 47 48 49 //整数部桁数 50 private readonly int LENGTH_INT_PART = 7; 51 //小数部桁数 52 private readonly int LENGTH_DECIMAL_PLACES = 2; 53 54 private void textHeight_TextChanged(object sender, EventArgs e) 55 { 56 var txtBox = sender as TextBox; 57 58 txtBox.TextChanged -= textHeight_TextChanged; 59 60 try 61 { 62 if (!string.IsNullOrWhiteSpace(txtBox.Text)) 63 { 64 var value = txtBox.Text; 65 //整数と小数を分割する 66 string[] values = value.Split('.'); 67 68 int currentPoint = 0; 69 switch (values.Length) 70 { 71 case 1: 72 73 74 75 76 77 //------------------------------ 78 //整数部のみで構成されている場合 79 //------------------------------ 80 //整数部の最大桁数を超えた場合、今回の入力値を無効にする 81 if (value.Length > LENGTH_INT_PART) 82 { 83 //DELETEやBackSpaceによる削除で桁あふれが発生しているなら 84 //小数点の削除によるものなので、先頭桁から削除する 85 if (isDelete) 86 { 87 txtBox.Text = value.Substring(value.Length - LENGTH_INT_PART); 88 89 //カーソル位置を移動 90 if (currentPoint - (values.Length - LENGTH_INT_PART) >= 0) 91 { 92 txtBox.SelectionStart = currentPoint - 93 (values.Length - LENGTH_INT_PART); 94 } 95 else 96 { 97 txtBox.SelectionStart = 0; 98 } 99 } 100 else 101 { 102 //入力後の現カーソル位置を取得 103 currentPoint = txtBox.SelectionStart; 104 105 //カーソル位置の前の1文字が今回入力された文字、 106 //よって、それを省いた文字列に編集する 107 var left = value.Substring(0 108 , currentPoint > LENGTH_INT_PART 109 ? LENGTH_INT_PART : currentPoint - 1); 110 var right = left.Length >= LENGTH_INT_PART 111 ? "" : value.Substring(currentPoint); 112 txtBox.Text = left + right; 113 114 //カーソル位置を入力前の位置に戻す 115 txtBox.SelectionStart = currentPoint - 1; 116 } 117 } 118 break; 119 120 121 122 123 124 125 //-------------------------------------------------------------------------------------------------------------------------------------- 126 case 2: 127 128 //---------------------------------- 129 //整数部+小数部で構成されている場合 130 //---------------------------------- 131 //入力後の現カーソル位置を取得 132 currentPoint = txtBox.SelectionStart; 133 134 //今回の入力値が"."の場合、小数点を基準点として桁あふれ分を除外する 135 if (value.Substring(currentPoint - 1, 1) == ".") 136 { 137 //=== 整数部の処理 === 138 var intPart = values[0]; 139 if (values[0].Length > LENGTH_INT_PART) 140 { 141 intPart = values[0].Substring(LENGTH_INT_PART - values[0].Length); 142 } 143 144 //=== 小数部の処理 === 145 var decimalPart = values[1]; 146 if (values[1].Length > LENGTH_DECIMAL_PLACES) 147 { 148 decimalPart = values[1].Substring(0, LENGTH_DECIMAL_PLACES); 149 } 150 151 //整数と小数を結合 152 if (values[0].Length > LENGTH_INT_PART || values[1].Length > LENGTH_DECIMAL_PLACES) 153 { 154 txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart); 155 156 //小数点入力時なら小数点の後ろにカーソルをセット 157 txtBox.SelectionStart = value.IndexOf(".") + 1; 158 } 159 } 160 else 161 { 162 //=== 整数部の処理 === 163 var intPart = values[0]; 164 if (values[0].Length > LENGTH_INT_PART) 165 { 166 //カーソル位置の前の1文字が今回入力された文字、 167 //よって、それを省いた文字列に編集する 168 var left = values[0].Substring(0 169 , currentPoint > LENGTH_INT_PART 170 ? LENGTH_INT_PART : currentPoint - 1); 171 var right = left.Length >= LENGTH_INT_PART 172 ? "" : values[0].Substring(currentPoint); 173 174 //桁数調整後の整数部文字列 175 intPart = left + right; 176 } 177 178 179 180 181 182 183 184 //=== 小数部の処理 === 185 var decimalPart = values[1]; 186 if (values[1].Length > LENGTH_DECIMAL_PLACES) 187 { 188 //整数部と小数点を除いたときのカーソル位置を算出 189 var tempPoint = currentPoint - values[0].Length - 1; 190 //カーソル位置の前の1文字を除外する 191 var left = values[1].Substring(0 192 , tempPoint > LENGTH_DECIMAL_PLACES 193 ? LENGTH_DECIMAL_PLACES : tempPoint - 1); 194 var right = left.Length >= LENGTH_DECIMAL_PLACES 195 ? "" : values[1].Substring(tempPoint); 196 197 //桁数調整後の小数部文字列 198 decimalPart = left + right; 199 } 200 201 //整数と小数を結合 202 if (values[0].Length > LENGTH_INT_PART || values[1].Length > LENGTH_DECIMAL_PLACES) 203 { 204 txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart); 205 206 //カーソル位置を入力前の位置に戻す 207 txtBox.SelectionStart = currentPoint - 1; 208 } 209 } 210 211 break; 212 213 214 215 216 217 default: 218 //"."で文字列を分割したときに3以上になるのなら、 219 //既に"."が存在しているのに今回"."が入力されたことを示す 220 //よって、今回の入力を無効にしてしまう。 221 { 222 currentPoint = txtBox.SelectionStart; 223 var left = value.Substring(0, currentPoint - 1); 224 var right = value.Substring(currentPoint); 225 txtBox.Text = left + right; 226 txtBox.SelectionStart = currentPoint - 1; 227 } 228 break; 229 } 230 231 232 233 234 //先頭が小数点なら先頭に 0 を入れる 235 if (txtBox.Text.StartsWith(".")) 236 { 237 currentPoint = txtBox.SelectionStart; 238 txtBox.Text = "0" + txtBox.Text; 239 txtBox.SelectionStart = currentPoint + 1; 240 } 241 } 242 } 243 catch (Exception ex) 244 { 245 Console.Error.WriteLine(ex); 246 } 247 finally 248 { 249 txtBox.TextChanged += textHeight_TextChanged; 250 } 251 252 253 254 255 }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2018/05/29 00:40

以前の質問で回答が得られてますが、何が理解できていないのでしょうか?
xlostdjx

2018/05/29 00:45

小数点の指定がまだピンとこなく、、、回答をいただいたのを拝見してもどの部分が小数点を指定しているなどがわからなかったので 例文もしくはなにかしらコードで示していただけたらと思いまして。
YAmaGNZ

2018/05/29 02:50

前回の質問でsaziさんの回答のリンク先にコードがありますが、こちらのコードを実装してデバッガで動作確認したりされましたか?そのコードに小数の桁制限の部分もありますので参考になりますよ。
xlostdjx

2018/05/30 01:42

質問を編集したのでみてアドバイスいただきたいです。
guest

回答2

0

ベストアンサー

厳しいようですが、デバッガの使い方を勉強して、自分のプログラムがどう動いているか、ステップ実行するなりして確かめてください。
プログラムのデバッグを行う時に必要なことです。
初級者向けVisualStudio便利機能集Vol.2(デバッグ編)などを参照してください。

ヒント:
if (b.Length > 1)
これがどのように判定されるか確認してください。

追記

下記のように、コードでイベントハンドラを登録するか

C#

1 textHeight.TextChanged += new System.EventHandler(textHeight_TextChanged); 2 textHeight.KeyDown += new System.Windows.Forms.KeyEventHandler(textHeight_KeyDown); 3 textHeight.KeyPress += new System.Windows.Forms.KeyPressEventHandler(textHeight_KeyPress);

下図のようにデザイナで登録するかしてください。
イメージ説明

動作に関しては、関数入口にブレイクポイントを設定すれば、キー入力した時にそこで停止するはずです。
自分で書いたコードが動作しているのか、していないのか、動作している場合はなぜ思っている動きをしないのかを調査するために最低限必要なことです。
デバッガの使い方を勉強してください。動作を確認してください。としつこく言っているのはこういうことです。

投稿2018/05/29 05:46

編集2018/05/30 02:42
YAmaGNZ

総合スコア10242

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xlostdjx

2018/05/29 07:31

if (b.Length > 1) は bに 165.5が入っていると仮定して .で区切られるので  165 と .5 配列が二つなので b には2が入っていることがわかりました。  ただ  数値とバックスペース以外の入力は不可にする事が適用されていないのはなぜかわかりません。 お答えいただきたいです。
YAmaGNZ

2018/05/29 07:39

最初からテキストボックスに"165.5"と入っているということでしょうか? 最初は「何も入力されていない」のでは? 仮定ではなく、実際に動作させた時の値を確認しましょう。
xlostdjx

2018/05/29 07:45

実際に動かしても 下記のことがらは適用されませんでした。 数値とバックスペース以外の入力は不可にする事が適用されていないのはなぜかわかりません。
YAmaGNZ

2018/05/29 07:55

if (b.Length > 1) ここにブレークポイントを張って、b.Lengthの値を確認しましたか? そこからステップ実行して、どのように実行されたか確認しましたか?
xlostdjx

2018/05/29 08:49

はい 確認しやり方を変えました。 コードを編集しました、
YAmaGNZ

2018/05/29 09:03

b.Lengthが1以下の場合、チェックが走りませんがよいのですか? 入力がなにもされていない場合や”1”の場合などだと1以下になりますよ?
xlostdjx

2018/05/29 09:11

はじめから一度 小数点第一位までを入力を可能にするコード書こうとおもいます これは理解するとかけるようになるなどあったら教えていただきたいです。 もしよろしければ正解のコードを教えていただきたいです。 ほぼコピペで組み立てていたので、。
YAmaGNZ

2018/05/29 09:28

前回の質問時にコードのあるページを回答してもらってるじゃないですか。 適度にコメントもありますし、実際に動作させながら勉強すればよいかと思います。
xlostdjx

2018/05/30 01:42

質問を編集したのでみてアドバイスいただきたいです。
YAmaGNZ

2018/05/30 01:57

まず、「適用されません」というあいまいな表現はやめましょう。 状況をなるべく具体的に説明するのも質問する時に重要なことです。 今回の場合、「数字以外を入力できてしまう」とか書くべきです。 次に、「数字以外が入力できてしまう」ということについてですが、 参考にしたページにあったKeyPressイベントはどうして記述していないのでしょうか?
xlostdjx

2018/05/30 02:06

すみません。コピーが抜け落ちてしまっていました。 KeyPressイベントをつけたしました。 「数字以外が入力できてしまう」というのは反映されていて制御できているのですが、 小数点の制限のところが反映されていないみたいです。
YAmaGNZ

2018/05/30 02:12

こちらで提示されたコードを動作させましたが、小数は1桁しか入力できません。 小数点も1つだけ入力可能です。 もしかして、コードをコピーしただけで、イベント登録してないということはありませんよね? デバッガで、イベント部分が呼び出されているか確認しましたか?
xlostdjx

2018/05/30 02:19

サイトでみて勉強したのですがいまいちイベントを理解していないです、なのでイベント登録できていないかもしれないです、 イベント部分が呼び出されているかどうかの確認も、どれかわからないので困っています。
xlostdjx

2018/05/30 02:29

あ イベント意味の理解しました!! そしたら動くようになりました!!お手数かけてすみません。
xlostdjx

2018/05/31 02:43

あと ComboBox(丸め区分)をコード上で値の設定を行う事についてなんですけど おすすめのやり方をおしえていただきたいです。
MMashiro

2018/05/31 10:23

それは複数質問を挙げることになってしまう為混乱を生んでしまうため本質問を解決済みにして新規で質問を立ち上げてください
guest

0

入力させない、ではなく、入力は自由にさせといて、Validateで小数点1位で取り込み、表示させるというのではダメでしょうか。
取り込み時にエラーが出たら、その旨表示し再入力させる、と。

初心者のうちはそのほうが簡単だと思いますよ


KeyPressでごそごそするというのはシュミでないんでちと考えてみました
直前の値を覚えておくためのtextval が必要なのがちとアレですが
あくまで一例ということで

C#

1using System.Text.RegularExpressions; 2 3 4 string textval; 5 // TextBoxのTextChange イベント 6 private void txTextChange(object sender, EventArgs e) 7 { 8 TextBox tx = sender as TextBox; 9 if (Regex.IsMatch(tx.Text, @"^\d*[.]?\d?$")) 10 { 11 textval = tx.Text; 12 } 13 else 14 { 15 tx.Text = textval; 16 } 17 }

投稿2018/05/28 14:39

編集2018/05/29 06:45
y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xlostdjx

2018/05/29 00:28

身長と体重の、テキストボックス入力時 数値のみ小数点第一位まで入力が可能であること。 バックスペースにて入力値が削除可能であること。= 数値とバックスペース以外の入力は不可 という条件なのですが .Split 等を使って表した方がいいですか?
y_waiwai

2018/05/29 00:36

「c# 数値のみ」でぐぐって、これをアレンジしよう、ってことで
xlostdjx

2018/05/29 05:19

改善したコードを張ったのでみてほしいです。 また反映されないところがでてきたので
y_waiwai

2018/05/29 06:45

回答を更新しました
xlostdjx

2018/05/29 06:50

ご回答ありがとうございます、 KeyPressを使用するのが条件でして、 KeyPressバージョンをかいていただくことは可能でしょうか??
xlostdjx

2018/05/30 01:42

質問を編集したのでみてアドバイスいただきたいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問