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

问题描述 投票:0回答:3

我有一个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

c# csv console-application inputstreamreader
3个回答
1
投票

首先,您应该使用像CsvHelper这样的专用CSV解析器,这可能会为您节省大量时间。

其次,如果你想解析一个数字,请使用像decimaldouble Parse这样的选项之一。在这种情况下NumberStyles.Float

decimal.Parse(number, NumberStyles.Float);

NumberStyles.Float

表示使用AllowLeadingWhiteAllowTrailingWhiteAllowLeadingSignAllowDecimalPointAllowExponent样式。这是一种复合数字样式。

AllowExponent

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

更新

您可以使用正则表达式来尝试确定该字段是否包含实际数字。像\d.\d+E[+-]\d+或更好的只是使用decminal.TryParse与适当的选项。


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


0
投票

检查该字段是否为数字以及科学记数法,然后格式为:

var _tempNuber =  splits[13].Trim().Contains('+') ? decimal.Parse(splits[13].Trim(), NumberStyles.Float).ToString() 
                                                  : splits[13].Trim();
© www.soinside.com 2019 - 2024. All rights reserved.