みなさんこんにちは!!ひろぽんです!!
最近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を作って色々テストしてみてください!
コメント