[英]VBA UserForm - Best way to use a TextBox as a decimal numerical input, independently of regional settings?
[英]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.