動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
技術記事

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

バイブス父さん
現役の業務SE
2020年11月11日3 min read
【C#】Decimalからintに変換する拡張メソッドを作ってみた

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

最近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()って打つのだるくね??

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

拡張メソッドにしてみた

拡張メソッドにしてみた (csharp)#b905bd1eaf03
    static class DecimalExtension
    {
        public static int ToInt(this decimal dec)
        {
            return decimal.ToInt16(dec);
        }
    }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

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

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

            int parsedInt = dec.ToInt();

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

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

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

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

問題点は小数点以下の丸め方法 (csharp)#8fc8bb304e09
            // => 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を用意します。

Decimalの小数点以下の丸め方法をフレキシブルにできるようにした (csharp)#cc20e50580bd
    public enum ParseType
    {
        四捨五入 = 1,
        切り捨て,
        切り上げ
    }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

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

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

Decimalの小数点以下の丸め方法をフレキシブルにできるようにした (csharp)#2d0a6dbedb96
    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);
        }
    }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

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

Decimalの小数点以下の丸め方法をフレキシブルにできるようにした (csharp)#e4a00beac695
            // => 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を作って色々テストしてみてください!

この記事のコードと手順は ぜんぶ動作検証済み。 安心して現場で試してくれ。
バイブス父さん

現役の業務SE。C# / SQL Server 保守の現場から、コードも人もキャリアも全部書く。 実体験ベース。

運営者について