如何使用VB.NET或SQL将科学计数法格式的账号转换为原始完整数值
科学计数法格式账号转换解决方案
VB端读取时转换(优先推荐)
你当前读取CSV文件时直接将分割后的字符串赋值到DataTable,科学计数法格式的字符串不会自动转成原始数值,可针对账号列单独做转换处理,核心逻辑是先将科学计数法字符串解析为Decimal类型,再格式化为无小数的普通字符串。
修改后赋值部分的代码示例如下(假设账号列的索引为1,请替换为你实际的账号列索引):
For i as Integer = 0 to dt.Columns.count-1 ' 单独处理账号列 If i = 1 Then Dim accountStr = str(i).Trim() ' 判断是否为科学计数法格式 If accountStr.Contains("E+") OrElse accountStr.Contains("e+") Then Dim decAccount As Decimal ' 支持科学计数法解析 If Decimal.TryParse(accountStr, System.Globalization.NumberStyles.Float, System.Globalization.CultureInfo.InvariantCulture, decAccount) Then ' 转为无小数的完整数字字符串 rowdt(i) = decAccount.ToString("F0") Else ' 转换失败保留原值方便排查 rowdt(i) = accountStr End If Else rowdt(i) = accountStr End If Else ' 其他列正常赋值 rowdt(i) = str(i).ToString() End If Next
SQL端比对时转换
如果已经将数据入库需要直接在SQL中做比对,可参考不同数据库的转换语法:
- SQL Server:
-- 转换后和库内原始账号比对即可 CAST(CAST(科学计数法账号字段 AS FLOAT) AS BIGINT) -- 需字符串比对的话再加一次转字符 CAST(CAST(科学计数法账号字段 AS FLOAT) AS BIGINT) AS 原始账号
- MySQL:
CAST(CAST(科学计数法账号字段 AS DECIMAL(20,0)) AS CHAR) AS 原始账号
- Oracle:
TO_CHAR(TO_NUMBER(科学计数法账号字段, '9.99999EEEE')) AS 原始账号
注意事项
- 若账号长度超过16位,不要使用Float/Double类型做中转,避免出现精度丢失,优先选择VB端用Decimal转换的方案
- 若原始账号存在前导零,科学计数法转换后会丢失前导零,这种情况建议找CSV导出方重新导出时将账号列设置为文本格式,从源头避免生成科学计数法内容
内容的提问来源于stack exchange,提问作者Muriel Mi
相关产品推荐
相关产品推荐

