C # преобразование десятичного числа в целое безопасно - PullRequest
10 голосов
/ 30 ноября 2011

Я пытаюсь безопасно преобразовать десятичное число в целое.

Что-то вроде

public static bool Decimal.TryConvertToInt32(decimal val, out int val)

это вернет false, если не может преобразовать в целое число, и true с успешным выводом, если может.

Это сделано для того, чтобы избежать перехвата OverflowException в методе decimal.ToInt32. Какой самый простой способ сделать это?

Ответы [ 5 ]

10 голосов
/ 30 ноября 2011

Здесь:

public static bool TryConvertToInt32(decimal val, out int intval)
{
    if (val > int.MaxValue || val < int.MinValue)
    {
      intval = 0; // assignment required for out parameter
      return false;
    }

    intval = Decimal.ToInt32(val);

    return true;
}
3 голосов
/ 30 ноября 2011

Я бы написал метод расширения для десятичного класса следующим образом:

public static class Extensions
{
    public static bool TryConvertToInt32(this decimal decimalValue, out int intValue)
    {
        intValue = 0;
        if ((decimalValue >= int.MinValue) && (decimalValue <= int.MaxValue))
        {
            intValue = Convert.ToInt32(decimalValue);
            return true;
        }
        return false;
    }
}

Вы можете использовать его таким образом:

if (decimalNumber.TryConvertToInt32(out intValue))
{
    Debug.WriteLine(intValue.ToString());
}
2 голосов
/ 30 ноября 2011

Сравните десятичное число с int.MinValue и int.MaxValue до преобразования.

0 голосов
/ 30 ноября 2011

Почему вы пытаетесь не поймать OverflowException? Это происходит по причине, и вы должны полностью поймать ее там, где вы звоните Decimal.ToInt32(). Исключения широко используются во всем фреймворке, и пользователи должны их ловить. Методы Try могут помочь вам сделать код более понятным и чистым, но там, где у фреймворка нет подходящего метода (в данном случае Decimal.TryConvertToInt32()), перехват OverflowException является подходящим решением. Это на самом деле более понятно, чем создание класса расширения или написание вашего собственного отдельного статического метода (оба из них включают в себя написание собственного кода, в котором фреймворк уже предоставляет вам эту функциональность).

0 голосов
/ 30 ноября 2011

Что не так с использованием Int32.TryParse (string)?

...