我有一个Oracle视图,它为我提供了这些数据:
DATUM STUNDE LAUFZEIT
-------------- ---------- -----------
30.10.14 00:00 11 ,433333333
列LAUFZEIT
声明为NUMBER
。我需要使用哪种格式将列转换为0,433333333
或舍入为0,4
?
我已经尝试了一些像Convert.ToSingle(reader.GetValue(2))
这样的类型,但总是遇到像
System.OverflowException:算术运算导致溢出
谢谢!
答案 0 :(得分:2)
您必须提及当前的文化:
Object source = ",433333333";
// This will fail with exception - Neutral Culture uses decimal point, not comma
//Single single = Convert.ToSingle(source, CultureInfo.InvariantCulture);
// OK: Russian culture (ru-RU) uses decimal comma, not decimal point
Single single = Convert.ToSingle(source, new CultureInfo("ru-RU"));
要以所需的格式表示值,请使用格式,例如对于 0,4 :
// F1 - one floating point
// "ru-RU" for decimal comma
String result = single.ToString("F1", new CultureInfo("ru-RU"));
编辑:见过异常堆栈跟踪,即
Arithmetic operation resulted in an overflow. at Oracle.DataAccess.Types.DecimalConv.GetDecimal(IntPtr numCtx)
可以得出结论,问题出在
中`Oracle.DataAccess.Types.DecimalConv.GetDecimal`
错误的根源可能在于Oracle Number(36)
或类似内容大于.Net Decimal
。由于您无法更改Oracle.DataAccess
库,因此只能在查询中转换为String:
select ...
cast(LAUFZEIT as VarChar2(40)),
...
答案 1 :(得分:1)
在解析之前,您始终可以自己添加前导零。在数字的开头添加零将永远不会改变它。
Convert.ToSingle('0' + reader.GetString(2).Replace(',','.'))
应该这样做。
我建议在解析之前使用reader.GetString()。
最好这样做:
Single a ;
if(Single.TryParse('0' + reader.GetString(2).Replace(',','.')), out a))
{
//Success code here
}
else
{
//Code to execute if string was not parsable here
}
这样你就不会得到异常