我有一个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());
如下所示
答案 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 ,这将为您节省大量时间。
第二,如果要解析数字,请使用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
与相应的选项一起使用。
答案 2 :(得分:0)
检查该字段是否为数字并采用科学计数法,然后将其格式设置为:
var _tempNuber = splits[13].Trim().Contains('+') ? decimal.Parse(splits[13].Trim(), NumberStyles.Float).ToString()
: splits[13].Trim();