我想將小數安全地轉換爲整數。C#將小數轉換爲int安全
喜歡的東西
public static bool Decimal.TryConvertToInt32(decimal val, out int val)
這將返回false,如果它不能轉換爲整數,如果它可以真正瓦特/輸出成功。
這是爲了避免捕獲decimal.ToInt32方法中的OverflowException。什麼是最簡單的方法來做到這一點?
我想將小數安全地轉換爲整數。C#將小數轉換爲int安全
喜歡的東西
public static bool Decimal.TryConvertToInt32(decimal val, out int val)
這將返回false,如果它不能轉換爲整數,如果它可以真正瓦特/輸出成功。
這是爲了避免捕獲decimal.ToInt32方法中的OverflowException。什麼是最簡單的方法來做到這一點?
這裏:
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;
}
請注意,您仍然需要在'false'路徑中指定'intval'。 –
@AnthonyPegram - 謝謝。 – Oded
比較轉換前的小數點與int.MinValue
和int.MaxValue
。
我會寫類小數像這樣的擴展方法:
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());
}
這有什麼錯使用Int32.TryParse(字符串)?
我不會將十進制轉換爲字符串,然後返回一個整數。這會花費很多性能,並且不會直接處理非整數小數。 – Superman
當然會。如果你做Int32.TryParse(「3.14」,d),你會得到一個False結果。 –
你爲什麼試圖避免趕上OverflowException
?這是有原因的,你應該完全抓住它,你叫。例外在整個框架中廣泛使用,用戶應該抓住它們。 Try方法可以幫助你使代碼更加緊湊和清晰,但是如果框架沒有合適的方法(在這種情況下爲Decimal.TryConvertToInt32()
),捕獲OverflowException
是合適的。實際上,比創建擴展類或編寫自己的單獨靜態方法(包括在框架已經爲您提供此功能的情況下編寫自己的代碼)更清楚。
你是否建議你應該*總是*捕捉異常,你應該*從不*試圖避免它們?如果是這樣,那是不好的建議。在可能的情況下絕對避免它們(例如,通過驗證它們的已知原因),並且只有在有實際處理它們的方法時才抓住它們。例外是昂貴的,它們不應該用於控制流程。 –
你是對的,我很欣賞評論。開發人員要確定這是否會發生很少或頻繁發生。根據我的經驗,用於轉換Decimal.ToInt32的類似OverflowException的事情很少會發生,並且異常處理程序可以很好地適當地設置結果。但是它取決於場景,並且我非常感謝您添加關於異常性能的重要注意事項。 – mattypiper
投擲和捕捉異常很昂貴。設置一個try/catch塊不是,並且如果導致異常的條件永遠不會發生,它可能比進行驗證[驗證將在轉換本身中重複]更便宜, – Random832
只有2種情況下拋出了OverflowException,即x int.MaxValue不能只用'if'嗎? –
harold
如果給出了0.5,你希望它做什麼? –
是否要舍入或捨去小數? – AllenG