我正在编写一个程序,用于解析和处理Excel工作表中的信息(文本和数字)。关于将单元格数据转换为Double变量,我遇到了一个奇怪的问题。大部分时间,并且由于Microsoft.Office.Interop.Excel导入,我使用:
var = CDbl(sheet.Cells(row,column).Value)
但是,我的工作表(由数千行组成)包含用“。”写的十进制数字。和“,”。在我的国家,“,”被视为小数点分隔符,因此任何数字如“1.23456789”都会引发CDbl的异常。
我找到了一个解决方法,其中包括不使用.Value而是使用单元格的.Text,并使用Replace()来删除“。”:
var = CDbl(sheet.Cells(row,column).Text.Replace(".", ","))
然而,由于我正在操作的纸张长度,这大大增加了我的执行时间。最快的方法是什么?有没有办法告诉Visual Studio摆脱区域设置并考虑“。”和“,”相似?还有其他建议吗?
非常感谢你。 :)
答案 0 :(得分:2)
正确的方法是使用double.Parse
(或decimal.Parse
)正确的文化或NumberFormatInfo
。例如,您可以使用德国文化:
Dim deCulture = new CultureInfo("de-DE")
Dim number = Double.Parse(sheet.Cells(row,column).Text, deCulture)
如果输入无效,则应使用Double.TryParse
代替。
答案 1 :(得分:0)
不要使用CDbl
,这只是旧版VB方言的残余部分,它不允许您更改其使用的数字格式;它假定您的计算机目前的文化。相反,使用.NET更强大的Double.Parse
方法,它允许您提供文化。
Tim指出,你可以使用culture来指定组和小数分隔符。但是,在你的情况下,由于你有混合格式,你需要识别哪个是某种方式,为此你可以使用正则表达式。
我将借用蒂姆的德国文化作为我的榜样,并以相反的格式使用美国:
Dim test1 = "12,342,123.2323"
Dim test2 = "122.222.636,22"
Dim toTest = test1
Dim output As Double
Dim usCulture = New CultureInfo("en-US")
Dim deCulture = New CultureInfo("de-DE")
If (Regex.IsMatch(toTest, "^(\d{1,3}\,)*\d{3}\.\d+$")) Then
output = Double.Parse(toTest, usCulture)
ElseIf (Regex.IsMatch(toTest, "^(\d{1,3}\.)*(\d{3})\,\d+$")) Then
output = Double.Parse(toTest, deCulture)
End If