我需要回答一些问题,以帮助调试我遇到的全球化/本地化问题,这让我感到非常难过。
1)如果我在全球化/本地化时将字符串转换为双精度,那么CType
的确如何工作?
根据我的研究,并询问办公室的其他开发人员,我认为CType应该使用您计算机上的任何文化设置。因此,例如CType("1.23", Double)
适用于美国文化计算机。但是,如果在荷兰的文化计算机上将123
转换为,
,其中.
被识别为小数点而1,23
被识别为千位分隔符,则会陷入困境。但是如果字符串是123
,那么它在荷兰计算机上可以正常工作,并在美国计算机上成为.ToString
。
2)如果我抓取一个数字并说doubleNumber.ToString
将其转换为字符串,1,234.56
如何工作?
根据我的经验,我99.9%确定不应该包含千位分隔符,因此像1234.56
这样的数字会在美国计算机上变成1234,56
,对吗?在荷兰文化计算机上,该数字将变为,
因为CType(#, Double)
是小数位,对吗?
3)在荷兰文化计算机上是否有办法让双.ToString
或.
以某种方式搞砸并开始将,
识别为应该识别小数分隔符而不是像荷兰文化那样的txt
?
底线:第3项是我遇到问题的地方。 99.9%的用户(美国和外国)可以正常运行我的软件而不会出现任何本地化问题。但荷兰的一位用户报告了一个错误,即从1,23
文件导入某个号码会将123
转换为.
。当我们的一位客户支持人员告诉他们将小数点更改为{{1}}时,它运行正常。由于某种原因使用美国文化计算机(他们坚持认为不是),荷兰用户不足以解释这个问题是怎么回事。
答案 0 :(得分: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)
如果没有提供其他文件,框架将使用当前线程的当前文化作为默认值。人们通常会在以下两种情况下设置适当的文化信息:
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