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 }
回答2件
あなたの回答
tips
プレビュー