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

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

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

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

Q&A

解決済

3回答

1714閲覧

小数点丸め処理を縮める方法

xlostdjx

総合スコア39

C#

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

0グッド

0クリップ

投稿2018/06/06 01:42

編集2018/06/06 02:52

追記 今このように処理をしていて
この関数を使うタイミングは、テキストボックスに表示させるときで
この関数にどんな動作をさせたいかは、整数の場合はそのま表示し 小数点があるときは少数第一位まで小数点を使用可能にする

この下記の処理で でバックしたところ
1.5 をテキストボックスを入力したとして 
最後に5の部分が この処理 ( else {decimal_point(txtBox);} //小数点の制御) によって省かれてしまいます。
この5を通す処理をかくにはどうすればよいのでしょうか?

C#

1コード 2// 小数点制御処理 3 public void decimal_process(TextBox txtBox) 4 { 5 try 6 { 7 if (!string.IsNullOrWhiteSpace(txtBox.Text)) 8 {   //○ 9 var value = txtBox.Text; 10 string[] values = value.Split('.'); //整数と小数を分割する 11 int currentPoint = 0; 12 13 if (values.Length > 0) 14 { //○ 15 16 //整数部のみで構成されている場合 17 18 //○ 19 20 //---------------------------------- 21 //整数+小数で構成されている場合 22 //---------------------------------- 23 //入力後の現カーソル位置を取得 24 25 //○ 26 currentPoint = txtBox.SelectionStart; 27 28 //今回の入力値が"."の場合、小数点を基準点として桁あふれ分を除外する 29 if (value.Substring(currentPoint - 1, 1) == ".") //○ 30 { 31 //=== 整数部の処理 === 32 var intPart = values[0]; //○ 33 if (values[0].Length > integral_digits) //○ 34 { 35 intPart = values[0].Substring(integral_digits - values[0].Length); 36 } 37 38 //=== 小数部の処理 === 39 var decimalPart = values[1]; //○ 40 if (values[1].Length > decimal_digits) //○ 41 { 42 decimalPart = values[1].Substring(0, decimal_digits); 43 } 44 //○ 45 //整数と小数を結合 46 if (values[0].Length > integral_digits || values[1].Length > decimal_digits) 47 { 48 txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart); 49 50 //小数点入力時なら小数点の後ろにカーソルをセット 51 txtBox.SelectionStart = value.IndexOf(".") + 1; 52 } 53 } 54 else //○ 55 { 56 //=== 整数部の処理 === 57 var intPart = values[0]; 58 if (values[0].Length > integral_digits) //○ 59 { 60 //カーソル位置の前の1文字が今回入力された文字、 61 //よって、それを省いた文字列に編集する 62 var left = values[0].Substring(0 63 , currentPoint > integral_digits 64 ? integral_digits : currentPoint - 1); 65 var right = left.Length >= integral_digits 66 ? "" : values[0].Substring(currentPoint); 67 68 //桁数調整後の整数部文字列 69 intPart = left + right; 70 } 71 72 //=== 小数部の処理 === 73 var decimalPart = values[1]; //○ 74 if (values[1].Length > decimal_digits) 75 { 76 //整数部と小数点を除いたときのカーソル位置を算出 77 var tempPoint = currentPoint - values[0].Length - 1; 78 //カーソル位置の前の1文字を除外する 79 var left = values[1].Substring(0 80 , tempPoint > decimal_digits 81 ? decimal_digits : tempPoint - 1); 82 var right = left.Length >= decimal_digits 83 ? "" : values[1].Substring(tempPoint); 84 85 //桁数調整後の小数部文字列 86 decimalPart = left + right; 87 } 88 89 //整数と小数を結合 90 if (values[0].Length > integral_digits || values[1].Length > decimal_digits) //○ 91 { 92 txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart); 93 94 //カーソル位置を入力前の位置に戻す 95 txtBox.SelectionStart = currentPoint - 1; 96 } 97 98 //ここの処理です。 99 else 100 { 101 decimal_point(txtBox); //小数点の制御 102 } 103 104 } 105 //○ 106 head_decimal(txtBox); //先頭が小数点なら先頭に 0 を入れる 107 108 } 109 } 110 }//○ 111 catch (Exception ex) //エラー時の処理 112 { 113 Console.Error.WriteLine(ex); 114 }//○ 115 finally //最後に必ず処理する 116 { 117 txtBox.TextChanged += textWeight_TextChanged; 118 119 } 120 }

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

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

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

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

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

ponpu1601

2018/06/06 02:30

漠然とコードを上げられても何も言えません。この関数を使うタイミングとこの関数にどんな動作をさせたいかを追記してください。
xlostdjx

2018/06/06 02:53

追記しました、
guest

回答3

0

ベストアンサー

Decimal使っちゃまずいのかな?

var value = txtBox.Text; decimal d0, d1, d2; d0 = Decimal.Parse(value); d1 = Decimal.Round(d0); // 整数化 d2 = Decimal.Round(d0, 1); // 小数第1位までの小数化 if (d1.ToString().Equals(d2.ToString()) { d0 = d1; // 入力が整数だった場合、d1,d2の文字列表現は同じ。 } else { d0 = d2; } // txtBox.Text = Decimal.ToString(d0); // ←誤 txtBox.Text = d0.ToString(); // ←正

投稿2018/06/06 03:36

編集2018/06/06 05:14
tkturbo

総合スコア5572

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

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

xlostdjx

2018/06/06 05:11

tkturbo さんのコードを try文のなかのif文のなかに書いてみたところ txtBox.Text = Decimal.ToString(d0) でエラーが起きました、 (d0)が decimalからStringへ変換することはできません、とエラーがでました、 でもToStringで変換するはずですよね??
tkturbo

2018/06/06 05:13

> txtBox.Text = Decimal.ToString(d0) でエラー ↑申し訳ない。「d0.ToString()」が正解です。 回答のコードも直しておきます。
xlostdjx

2018/06/06 05:45 編集

いえ! ありがとうございます!!! ただこのとうりで行く (.)を打つと 下記の処理で (.)の前の数字が無くなってしまいます  /// <summary> /// 体重のテキストボックス入力時数値のみ小数点第一位までを入力を可能にする制御。 /// </summary> private void textWeight_TextChanged(object sender, EventArgs e) {  //○ var txtBox = sender as TextBox; txtBox.TextChanged -= textWeight_TextChanged; decimal_process(txtBox); }
guest

0

見たところ整数部分の桁数判定もしているようですし、
decimal_point(txtBox);で何をしてるのかわからないですが、

else部分を通りたくないだけであればif文の条件を見直すか、
elseifで通らないようにしてあげればいいんではないでしょうか。

あと見たところ全く同じ条件判定をしている部分が見受けられますので
処理フローの見直しもした方がいいのでは。

投稿2018/06/06 03:49

ponpu1601

総合スコア166

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

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

0

case文が2つとdefault文があるので、switch構文を使う意味はあると思います。

switch構文は、if-then-else構文に書き換え可能ですし、個々人の好みもありますから、ご自分が好ましいとおもうように書き換えれば良いのではないでしょうか。

 コーディング規則("なるべくswitch構文は使わない"など)が決められている場合は、それに従ってくださいね。

投稿2018/06/06 02:35

coco_bauer

総合スコア6915

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

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

xlostdjx

2018/06/06 02:59

case文に中の処理がなくても役割をはたしていればOKですか??
coco_bauer

2018/06/06 04:22

既に質問のコードが書き換わっているので、私の回答は意味を持ちません。意味を持たないものに対する質問も同様かと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問