在VB.NET CDbl和十进制分隔符 – 有没有办法绕过区域设置?

我正在编写一个程序,用于从Excel工作表中分析和处理信息(文本和数字)。 我面临一个奇怪的问题,有关将单元格数据转换为Doublevariables。 大多数时候,并感谢Microsoft.Office.Interop.Excel导入,我使用:

var = CDbl(sheet.Cells(row,column).Value) 

但是,我的工作表(由数千行组成)包含用“。”表示的十进制数字。 和“,”。 在我国,“,”被认为是小数分隔符,所以像“1.23456789”这样的任何数字都会引起CDbl的exception。

我find了一个解决方法,它不是使用.Value,而是使用单元格的.Text,并使用Replace()去除“。”:

 var = CDbl(sheet.Cells(row,column).Text.Replace(".", ",")) 

但是,由于我操作的工作表的长度,这大大增加了我的执行时间。 什么是最快的方法来做到这一点? 有没有办法告诉Visual Studio摆脱区域设置,并考虑“。” 和“,”一样? 还有其他build议吗?

非常感谢你。 🙂

正确的方法是使用double.Parse (或decimal.Parse )与正确的文化或NumberFormatInfo 。 你可以例如使用德国文化:

 Dim deCulture = new CultureInfo("de-DE") Dim number = Double.Parse(sheet.Cells(row,column).Text, deCulture) 

如果input可能无效,则应该使用Double.TryParse来代替。

不要使用CDbl ,这只是旧的VB方言的残余,它不允许你改变它使用的数字格式; 它假定你的电脑的当前文化。 相反,使用.NET的更强大的Double.Parse方法可以让你提供文化。

正如Tim指出的那样,您可以使用文化来指定组和小数点分隔符。 在你的情况,虽然,因为你有混合格式,你需要识别哪个是哪个,为此你可以使用正则expression式。

我将借用Tim的德国文化来举例说明,并使用美国的格式:

 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