VB .NET中的CDbl和小数分隔符 - 有没有办法绕过区域设置?

时间:2017-05-05 11:46:11

标签: excel vb.net visual-studio parsing

我正在编写一个程序,用于解析和处理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摆脱区域设置并考虑“。”和“,”相似?还有其他建议吗?

非常感谢你。 :)

2 个答案:

答案 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