2012-03-21 46 views
3

我很長一段時間C#開發人員,最近不得不看一些VB6代碼。經過一番挖掘,我們發現,在某個地方,不知何故,我們將一個數字存儲爲一個字符串。現在我們正在閱讀它,並且我們的代碼沒有很好地處理文化差異。這裏有一個例子:VB6 - 使用特定文化將字符串轉換爲double?

Dim text as String 
Dim myVal as Double 
Set text = "1,123456" 
'This sets the value of myVal to 1123456 on our system - incorrect 
myVal = text 

Set text = "1.123456" 
'This sets the value of myVal to 1.123456 on our system - correct 
myVal = text 

銘記,這是VB6和VB.NET不是,是否有任何內置的方法,函數,什麼的,能夠在字符串中使用一種特定的文化轉換爲雙? 或者至少,暗示轉換我們可能會處理不同的格式?

我們仍在挖掘價值的寫作方式,看看我們是否可以逆向設計流程,以便爲我們提供一致的結果。但是,我們的客戶已經擁有一種格式或另一種格式的數據(或者兩者都有,我們正在檢查......),所以適當的轉換算法或實現在這一點上會是更好的答案。

+0

您將需要一些關於數字來自何處的知識以瞭解如何轉換它。對於一個非常簡單的方法,你可以用一個替換。並傳遞給'Val()'。當然,如果你得到12,345.67,那麼你就搞砸了。 – Deanna 2012-03-22 12:34:47

回答

7

我已經在過去使用這個快速而髒的函數來從文本中獲得一個double。在阿根廷,人們有時使用該點,有時使用逗號分隔十進制值,因此該功能已準備好接受這兩種格式。如果只有一個標點符號,則認爲它是小數點分隔符。

function ConvertDBL(texto) 
    dim retval, SepDecimal, SepMiles 
    If texto = "" then texto = "0" 
    retval = replace(trim(texto), " ", "") 
    If cdbl("3,24") = 324 then 
     SepDecimal = "." 
     SepMiles = "," 
    else 
     SepDecimal = "," 
     SepMiles = "." 
    end if 
    If InStr(Retval, SepDecimal) > 0 then 
     If InStr(Retval, SepMiles) > 0 then 
      If InStr(Retval, SepDecimal) > InStr(Retval, SepMiles) then 
       Retval = replace(Retval, SepMiles, "") 
      else 
       Retval = replace(Retval, SepDecimal, "") 
       Retval = replace(Retval, SepMiles, SepDecimal) 
      end if 
     end if  
    else 
     Retval = replace(Retval, SepMiles, SepDecimal) 
    end if 
    ConvertDbl = cdbl(retval) 
end function 
+0

感謝您的回覆。雖然我可能不會像現在這樣使用它,但是您嘗試轉換「3,24」以檢測您所處的文化只是天才的檢測機制! Muchas Gracias! – 2012-03-22 14:10:36

2

您不能通過在.Net中傳遞文化對象來選擇任意文化。您可以選擇:

  • 總是使用當前區域設置的功能。 CStr,Format,CDbl等隱式轉換(就像你問題中的那些)也使用當前的區域設置。
  • 總是使用美國地區設置的功能(類似於.Net不變文化)。 StrVal

一般從控制面板所採取的當前區域設置。有rumours,你可以調用SetThreadLocale在運行時從代碼更改區域設置 - 從來沒有嘗試過。

+0

感謝您的額外信息。我們意識到這些限制。然而,由於某種原因,數據以不同的格式結尾到我們客戶的數據庫中。我們知道,有些用戶更喜歡使用en-US作爲他們的文化,儘管他們不在美國。因此,基本上,我們需要能夠在VB6中將「1,2345」或「1.2345」解析爲1.2345d。是的,我們知道在某些文化中,這兩種符號意味着完全不同的東西。但在我們的特殊情況下,我們相信只有十進制數字存儲在數據庫中。感謝您的輸入。 – 2012-03-23 02:28:45

+0

嘗試檢測格式,然後相應地處理?像這樣? bDot =(Instr(test,「。」)> 0)bComma =(Instr(test,「,」)> 0)如果bDot和bComma則Err.Raise vbObjectError + 512,「無法用點和逗號處理值」如果bComma Then test = Replace(test,「,」,「。」)End If value = Val(test) – MarkJ 2012-03-25 14:05:25

+0

你是對的。我們可以用Eduardo的代碼處理大多數情況。棘手的情況是1,234,你不能假設它是1.234。在使用「,」作爲數字分組的文化中,它可能是1234。我們想了解不一致的數據是如何進入數據庫的,因此我們可以做出更有教育的猜測,即我們是否應該假設1,234總是意味着1.234,或者我們有可能意味着1234的情況。感謝您的幫助。 – 2012-03-26 15:08:11

相關問題