关于Ctype&的本地化/全球化的问题的ToString

时间:2014-06-05 14:46:27

标签: .net vb.net localization globalization aspose

我需要回答一些问题,以帮助调试我遇到的全球化/本地化问题,这让我感到非常难过。

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}}时,它运行正常。由于某种原因使用美国文化计算机(他们坚持认为不是),荷兰用户不足以解释这个问题是怎么回事。

2 个答案:

答案 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