关于 Ctype & .ToString 的本地化/全球化的问题
Posted
技术标签:
【中文标题】关于 Ctype & .ToString 的本地化/全球化的问题【英文标题】:Questions on localization/globalization of Ctype & .ToString 【发布时间】:2014-07-26 15:06:57 【问题描述】:我需要回答几个问题,以帮助调试我遇到的全球化/本地化问题,这让我很困惑。
1) 在全球化/本地化方面,如果我将字符串转换为双精度字符串,CType
究竟如何工作?
根据我的研究并询问办公室中的其他开发人员,我认为 CType 应该使用您计算机上的任何文化设置。因此,例如CType("1.23", Double)
可以很好地用于美国文化计算机。但是如果在荷兰的文化计算机上将其转换为123
会搞砸,其中,
被识别为小数点,.
被识别为千位分隔符。但是如果字符串是1,23
,那么它在荷兰计算机上可以正常工作,在美国计算机上变成123
。
2)如果我抓取一个数字并说doubleNumber.ToString
将其转换为字符串,.ToString
是如何工作的?
根据我在这里的经验,我 99.9% 确信不应该包含千位分隔符,所以像 1,234.56
这样的数字在美国计算机上会变成 1234.56
,对吗?在荷兰文化计算机上,该数字将变为1234,56
,因为,
是小数位,对吧?
3) 在荷兰文化计算机上,有没有办法让双精度上的 CType(#, Double)
或 .ToString
搞砸并开始将 .
识别为小数分隔符而不是 @ 987654337@像荷兰文化应该承认吗?
底线:第 3 项是我遇到问题的地方。我的 99.9% 的美国和外国用户都可以正常运行我的软件,而不会出现任何本地化问题。但是荷兰的一位用户报告了一个错误,即从txt
文件中导入一个数字会以某种方式将1,23
转换为123
。当我们的一位客户支持人员告诉他们将小数点更改为.
时,它工作正常。由于某种原因,缺少该荷兰用户使用美国文化计算机(他们坚称自己不是),我无法弄清楚这个问题是如何发生的。
【问题讨论】:
【参考方案1】:您的假设是正确的。 .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。
【讨论】:
【参考方案2】:如果没有提供其他的,框架将使用当前线程的当前文化作为默认值。通常会在以下任一位置设置适当的文化信息:
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
【讨论】:
以上是关于关于 Ctype & .ToString 的本地化/全球化的问题的主要内容,如果未能解决你的问题,请参考以下文章
0607am抽象类&接口&析构方法&tostring&小知识点