【C#】Decimalからintに変換する拡張メソッドを作ってみた

この記事は約 3 分で読めます。

みなさんこんにちは!!ひろぽんです!!

最近DecimalをIntに変換したいなーーと思って色々調べたら、decimalのstaticメソッドを使って変換しないといけないことを知って驚きました!!!

普通にdecimalのそもそものメソッドとしてToIntなるものがあると思っていたからです。

って事で、自分で作ろうとなりまして、今回はそんなDecimalをintに変換する拡張メソッドを作ってみたので公開します。

通常のDecimalからintの変換

普通にC#が用意してるメソッドを使ってDecimalをintに変換するには、下記のようなコードを書かないといけません。

            decimal dec = (decimal) 1.111111;
            int parsedInt = decimal.ToInt16(dec);

正直めんどくさくね??

わざわざdecimal.ToInt16()って打つのだるくね??

って事で拡張メソッドを用意してみました。

拡張メソッドにしてみた

    static class DecimalExtension
    {
        public static int ToInt(this decimal dec)
        {
            return decimal.ToInt16(dec);
        }
    }

こんな感じでstaticなクラスを用意します。

これを入れることによりこんな書き方ができます。

            int parsedInt = dec.ToInt();

これを実行するとこんな感じ!

問題点は小数点以下の丸め方法

ただこれ一つ問題があります。

小数点以下が0に近い数字になるように変換されるのです。

            // => 1
            Console.WriteLine(((decimal)1.1111).ToInt());

            // => 1
            Console.WriteLine(((decimal)1.9999).ToInt());

            // => 0
            Console.WriteLine(((decimal)0.9999).ToInt());

            // => 11
            Console.WriteLine(((decimal)11.55551).ToInt());

            // => -11
            Console.WriteLine(((decimal) -11.111).ToInt());

            // => -11
            Console.WriteLine(((decimal)-11.999).ToInt());

            // => 0
            Console.WriteLine(((decimal)-0.999).ToInt());

実行結果はこんな感じ!

Decimalの小数点以下の丸め方法をフレキシブルにできるようにした

なのでToIntに引数を持ち、丸め方法を自由にできるようにしました。

まずはEnumを用意します。

    public enum ParseType
    {
        四捨五入 = 1,
        切り捨て,
        切り上げ
    }

そのEnumを引数に四捨五入とか、切り上げとかします。

デフォルトは四捨五入にしました。

    static class DecimalExtension
    {
        public static int ToInt(this decimal dec, ParseType type = ParseType.四捨五入)
        {
            var roundedDec = default(Decimal);
            switch (type)
            {
                case ParseType.切り上げ:
                    roundedDec = Math.Ceiling(dec);
                    break;
                case ParseType.切り捨て:
                    roundedDec = Math.Floor(dec);
                    break;
                default:
                    roundedDec = Math.Round(dec, MidpointRounding.AwayFromZero);
                    break;
            }

            return decimal.ToInt16(roundedDec);
        }
    }

これを使えば下記のような書き方ができます。

            // => 2
            Console.WriteLine(((decimal)1.5).ToInt(ParseType.切り上げ));

            // => 1
            Console.WriteLine(((decimal)1.5).ToInt(ParseType.切り捨て));

            // => 2
            Console.WriteLine(((decimal)1.5).ToInt());

            Console.ReadLine();

実行するとこんな感じ!

今回のソースコードはGithubで公開しています!

今回のコードはgithubのリポジトリにDecimalToIntというフォルダ名で公開しています!

興味のある方は是非ローカルにCloneを作って色々テストしてみてください!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA