在读取自动序列化的csv文件时将科学计数法值转换为数字1

时间:2019-03-26 05:40:06

标签: c# csv console-application inputstreamreader

我有一个csv文件,必须将其导入数据库。通过流读取器读取文件时,某些值会转换为科学计数法,例如“ 5.00E + 11”。我必须将其还原为原始值。这是由工作完成的,因此我无法手动将单元格设置为“文本”或“特殊”格式。当该单元格的格式设置为“文本”或“特殊”时,它可以正常工作。

我需要如下结果:

    "5.00E+11" should be converted into "500000000000"
    "8.12E+12" should be converted into "8122280000000"

我读取文件的代码如下:

    /// <summary>
    /// This is used to read the csv file
    /// </summary>
    using (StreamReader reader = new StreamReader(comepleteFilePath))
    {
       values = reader.ReadToEnd()
                      .Split(new string[] 
                      { Environment.NewLine },
                       StringSplitOptions.RemoveEmptyEntries
                      ).ToList();
     }         

    var _tempNuber = Convert.ToString(splits[13].Trim()); 

如下所示

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以将该字符串解析为十进制

    string s = "5.00E+11";
    decimal d = decimal.Parse(s, NumberStyles.Float);

输出

500000000000

如果只想解析一个指数元素,则可以检查给定的字符串是否为指数

double d = 0;
if(str.Contains("E") && double.TryParse(str, out d))
{
   //Your conversion
}

POC:.net fiddle

答案 1 :(得分:1)

首先,您应该使用专用的 CSV 解析器,例如 CsvHelper ,这将为您节省大量时间。

第二,如果要解析数字,请使用decimaldouble Parse之类的选项之一。在这种情况下,NumberStyles.Float

decimal.Parse(number, NumberStyles.Float);

NumberStyles.Float

  

表示AllowLeadingWhiteAllowTrailingWhite,   AllowLeadingSignAllowDecimalPointAllowExponent样式是   用过的。这是一种复合数字样式。

     

AllowExponent

     

表示数字字符串可以采用指数表示法。的   AllowExponent标志允许解析的字符串包含指数   以“ E”或“ e”字符开头,后跟一个   可选的正负号和整数。换句话说,它   成功解析了nnnExx,nnnE + xx和nnnE-xx形式的字符串。   不允许使用小数点分隔符或有效数字或符号   尾数;要允许解析字符串中的这些元素,请使用   AllowDecimalPoint和AllowLeadingSign标志,或使用复合样式   包括这些单独的标志。

更新

您可以使用正则表达式来尝试确定该字段是否确实包含实际数字。像\d.\d+E[+-]\d+甚至更好一样,只需将decminal.TryParse与相应的选项一起使用。

答案 2 :(得分:0)

检查该字段是否为数字并采用科学计数法,然后将其格式设置为:

var _tempNuber =  splits[13].Trim().Contains('+') ? decimal.Parse(splits[13].Trim(), NumberStyles.Float).ToString() 
                                                  : splits[13].Trim();