转换数字不带前导零用于在C#中使用

时间:2015-04-21 08:08:28

标签: c# database oracle numbers converter

我有一个Oracle视图,它为我提供了这些数据:

DATUM              STUNDE LAUFZEIT
-------------- ---------- -----------
30.10.14 00:00         11  ,433333333

LAUFZEIT声明为NUMBER。我需要使用哪种格式将列转换为0,433333333或舍入为0,4

enter image description here

我已经尝试了一些像Convert.ToSingle(reader.GetValue(2))这样的类型,但总是遇到像

这样的错误
  

System.OverflowException:算术运算导致溢出

谢谢!

2 个答案:

答案 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
}

这样你就不会得到异常