我有一个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());
如下
首先,您应该使用像CsvHelper这样的专用CSV解析器,这可能会为您节省大量时间。
其次,如果你想解析一个数字,请使用像decimal
或double
Parse
这样的选项之一。在这种情况下NumberStyles.Float
decimal.Parse(number, NumberStyles.Float);
表示使用
AllowLeadingWhite
,AllowTrailingWhite
,AllowLeadingSign
,AllowDecimalPoint
和AllowExponent
样式。这是一种复合数字样式。AllowExponent
表示数字字符串可以是指数表示法。 AllowExponent标志允许解析的字符串包含以“E”或“e”字符开头的指数,后跟可选的正号或负号以及整数。换句话说,它成功地以nnnExx,nnnE + xx和nnnE-xx的形式解析字符串。它不允许使用小数分隔符或在有效数字或尾数中签名;要允许解析字符串中的这些元素,请使用AllowDecimalPoint和AllowLeadingSign标志,或使用包含这些单独标志的复合样式。
更新
您可以使用正则表达式来尝试确定该字段是否包含实际数字。像\d.\d+E[+-]\d+
或更好的只是使用decminal.TryParse
与适当的选项。
您可以将该字符串解析为十进制
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
检查该字段是否为数字以及科学记数法,然后格式为:
var _tempNuber = splits[13].Trim().Contains('+') ? decimal.Parse(splits[13].Trim(), NumberStyles.Float).ToString()
: splits[13].Trim();