2014-06-05 55 views
1

我需要回答幾個問題來幫助調試我遇到的全球化/本地化問題,這讓我非常難過。關於Ctype&.ToString本地化/全球化的問題

1)CType如果在全球化/本地化時將字符串轉換爲雙精度值,究竟是如何工作的?從我的研究,並要求在辦公室的其他開發人員,我認爲CType應該使用您的計算機上的任何文化設置。因此,例如CType("1.23", Double)可以在美國文化計算機上正常工作。但是如果說荷蘭的文化計算機將其轉換爲123,那麼,被識別爲小數點,而.被識別爲千位分隔符。但如果字符串是1,23,那麼它在荷蘭計算機上工作正常,在美國計算機上變成123

2)如何.ToString工作,如果我搶了許多,說doubleNumber.ToString將其轉換爲字符串?

根據我在這裏的經驗,我99.9%確定不應該包含千位分隔符,因此1,234.56這個數字在美國計算機上會變成1234.56,對嗎?而在荷蘭文化計算機上,這個數字將變成1234,56,因爲,是小數位,對吧?

3)是否有荷蘭文化的計算機上的方式,在雙CType(#, Double).ToString能在某種程度上陷入困境,並開始認識到.作爲小數點分隔符,而不是像,荷蘭文化應該承認?

底線:項目#3是我遇到我的問題。 99.9%的美國和外國用戶可以在沒有任何本地化問題的情況下運行我的軟件。但是荷蘭的用戶報告了一個錯誤,其中導入txt文件中的數字以某種方式將1,23轉換爲123。當我們的客戶支持人員告訴他們將小數點更改爲.時,它工作正常。由於某種原因,使用美國文化計算機(他們堅持認爲他們沒有)的荷蘭用戶,我無法弄清楚這個問題是如何發生的。

回答

2

你說得對。 .NET將使用當前計算機的文化。

應用特定文化的方式是:

Dim str As String = "97.9" 
Dim num As Double = Double.Parse(str, Globalization.CultureInfo.InvariantCulture) 

而同樣將數字轉換爲字符串:

num = 97.9 
str = num.ToString(Globalization.CultureInfo.InvariantCulture) 

您可以指定需要的文化,看到這個MSDN Documentation

1

如果沒有其他提供,框架將使用當前線程的當前文化作爲默認值。人們通常會設置適當的文化信息在任一:

1)應用程序的入口點方法:

<STAThread()> 
Public Shared Sub Main() 
    Thread.CurrentThread.CurrentCulture = New CultureInfo("nb-NO") 
    Thread.CurrentThread.CurrentUICulture = New CultureInfo("nb-NO") 
    Application.SetCompatibleTextRenderingDefault(False) 
    Application.EnableVisualStyles() 
    Application.Run(New Form1) 
End Sub 

2)你的主窗體的構造函數:

Public Sub New() 
    Me.InitializeComponent() 
    Thread.CurrentThread.CurrentCulture = New CultureInfo("nb-NO") 
    Thread.CurrentThread.CurrentUICulture = New CultureInfo("nb-NO") 
End Sub 

當然你也可以當成員具有IFormatProvider參數時,請設置文化信息:

1.2R.ToString(New CultureInfo("en-US")) 

輸出:1.2

1.2R.ToString(New CultureInfo("nb-NO")) 

輸出:1,2-