2011-11-30 97 views
9

我想將小數安全地轉換爲整數。C#將小數轉換爲int安全

喜歡的東西

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

這將返回false,如果它不能轉換爲整數,如果它可以真正瓦特/輸出成功。

這是爲了避免捕獲decimal.ToInt32方法中的OverflowException。什麼是最簡單的方法來做到這一點?

+1

只有2種情況下拋出了OverflowException,即x int.MaxValue不能只用'if'嗎? – harold

+2

如果給出了0.5,你希望它做什麼? –

+1

是否要舍入或捨去小數? – AllenG

回答

9

這裏:

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; 
} 
+1

請注意,您仍然需要在'false'路徑中指定'intval'。 –

+0

@AnthonyPegram - 謝謝。 – Oded

2

比較轉換前的小數點與int.MinValueint.MaxValue

3

我會寫類小數像這樣的擴展方法:

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()); 
} 
0

這有什麼錯使用Int32.TryParse(字符串)?

+0

我不會將十進制轉換爲字符串,然後返回一個整數。這會花費很多性能,並且不會直接處理非整數小數。 – Superman

+0

當然會。如果你做Int32.TryParse(「3.14」,d),你會得到一個False結果。 –

0

你爲什麼試圖避免趕上OverflowException?這是有原因的,你應該完全抓住它,你叫。例外在整個框架中廣泛使用,用戶應該抓住它們。 Try方法可以幫助你使代碼更加緊湊和清晰,但是如果框架沒有合適的方法(在這種情況下爲Decimal.TryConvertToInt32()),捕獲OverflowException是合適的。實際上,比創建擴展類或編寫自己的單獨靜態方法(包括在框架已經爲您提供此功能的情況下編寫自己的代碼)更清楚。

+1

你是否建議你應該*總是*捕捉異常,你應該*從不*試圖避免它們?如果是這樣,那是不好的建議。在可能的情況下絕對避免它們(例如,通過驗證它們的已知原因),並且只有在有實際處理它們的方法時才抓住它們。例外是昂貴的,它們不應該用於控制流程。 –

+0

你是對的,我很欣賞評論。開發人員要確定這是否會發生很少或頻繁發生。根據我的經驗,用於轉換Decimal.ToInt32的類似OverflowException的事情很少會發生,並且異常處理程序可以很好地適當地設置結果。但是它取決於場景,並且我非常感謝您添加關於異常性能的重要注意事項。 – mattypiper

+0

投擲和捕捉異常很昂貴。設置一個try/catch塊不是,並且如果導致異常的條件永遠不會發生,它可能比進行驗證[驗證將在轉換本身中重複]更便宜, – Random832