簡體   English   中英

VB .NET中的CDbl和十進制分隔符-是否可以繞過區域設置?

[英]CDbl and decimal separators in VB .NET - Is there a way to bypass Regional Settings?

我正在編寫一個程序,用於分析和處理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擺脫區域設置並考慮“”。 和“,”一樣嗎? 還有其他建議嗎?

非常感謝你。 :)

正確的方法是將double.Parse (或decimal.Parse )與正確的區域性或NumberFormatInfo 例如,您可以使用德國文化:

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

如果輸入可能無效,則應改用Double.TryParse

不要使用CDbl ,這只是較舊的VB方言的殘余,不允許您更改其使用的數字格式。 它假定您計算機的當前文化。 而是使用.NET功能更強大的Double.Parse方法,該方法允許您提供區域性。

正如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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM