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

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

ただいまの
回答率

90.75%

  • C#

    6539questions

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

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 206

xlostdjx

score 22

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

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

コード
// 小数点制御処理
        public void decimal_process(TextBox txtBox)
        {
            try
            {
                if (!string.IsNullOrWhiteSpace(txtBox.Text))
                {   //○
                    var value = txtBox.Text;
                    string[] values = value.Split('.');  //整数と小数を分割する
                    int currentPoint = 0;

                    if (values.Length > 0)
                    {  //○

                        //整数部のみで構成されている場合

                        //○

                        //----------------------------------
                        //整数+小数で構成されている場合
                        //----------------------------------
                        //入力後の現カーソル位置を取得

                        //○
                        currentPoint = txtBox.SelectionStart;

                        //今回の入力値が"."の場合、小数点を基準点として桁あふれ分を除外する
                        if (value.Substring(currentPoint - 1, 1) == ".") //○
                        {
                            //=== 整数部の処理 ===
                            var intPart = values[0]; //○
                            if (values[0].Length > integral_digits) //○
                            {
                                intPart = values[0].Substring(integral_digits - values[0].Length);
                            }

                            //=== 小数部の処理 ===
                            var decimalPart = values[1]; //○
                            if (values[1].Length > decimal_digits) //○
                            {
                                decimalPart = values[1].Substring(0, decimal_digits);
                            }
                            //○
                            //整数と小数を結合
                            if (values[0].Length > integral_digits || values[1].Length > decimal_digits)
                            {
                                txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart);

                                //小数点入力時なら小数点の後ろにカーソルをセット
                                txtBox.SelectionStart = value.IndexOf(".") + 1;
                            }
                        }
                        else //○
                        {
                            //=== 整数部の処理 ===
                            var intPart = values[0];
                            if (values[0].Length > integral_digits) //○
                            {
                                //カーソル位置の前の1文字が今回入力された文字、
                                //よって、それを省いた文字列に編集する
                                var left = values[0].Substring(0
                                    , currentPoint > integral_digits
                                        ? integral_digits : currentPoint - 1);
                                var right = left.Length >= integral_digits
                                    ? "" : values[0].Substring(currentPoint);

                                //桁数調整後の整数部文字列
                                intPart = left + right;
                            }

                            //=== 小数部の処理 ===
                            var decimalPart = values[1]; //○
                            if (values[1].Length > decimal_digits)
                            {
                                //整数部と小数点を除いたときのカーソル位置を算出
                                var tempPoint = currentPoint - values[0].Length - 1;
                                //カーソル位置の前の1文字を除外する
                                var left = values[1].Substring(0
                                    , tempPoint > decimal_digits
                                        ? decimal_digits : tempPoint - 1);
                                var right = left.Length >= decimal_digits
                                        ? "" : values[1].Substring(tempPoint);

                                //桁数調整後の小数部文字列
                                decimalPart = left + right;
                            }

                            //整数と小数を結合
                            if (values[0].Length > integral_digits || values[1].Length > decimal_digits) //○
                            {
                                txtBox.Text = string.Format("{0}.{1}", intPart, decimalPart);

                                //カーソル位置を入力前の位置に戻す
                                txtBox.SelectionStart = currentPoint - 1;
                            }

 //ここの処理です。
                            else
                            {
                                decimal_point(txtBox); //小数点の制御
                            }

                        }
                        //○
                        head_decimal(txtBox); //先頭が小数点なら先頭に 0 を入れる

                    }
                }
            }//○
            catch (Exception ex) //エラー時の処理
            {
                Console.Error.WriteLine(ex);
            }//○
            finally //最後に必ず処理する
            {                        
                txtBox.TextChanged += textWeight_TextChanged;

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • ponpu1601

    2018/06/06 11:30

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

    キャンセル

  • mts10806

    2018/06/06 11:34

    現在の質問内容では要件が伝わりにくく回答が得られにくいように思います。質問テンプレートをご活用ください。https://teratail.com/help/question-tips#questionTips3-8

    キャンセル

  • xlostdjx

    2018/06/06 11:53

    追記しました、

    キャンセル

回答 3

checkベストアンサー

+3

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 14:11

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

    キャンセル

  • 2018/06/06 14:13

    > txtBox.Text = Decimal.ToString(d0) でエラー

    ↑申し訳ない。「d0.ToString()」が正解です。
    回答のコードも直しておきます。

    キャンセル

  • 2018/06/06 14:43 編集

    いえ! ありがとうございます!!!

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/06/06 11:59

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

    キャンセル

  • 2018/06/06 13:22

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

    キャンセル

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6539questions

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