嗯,为了避免Format Exceptions
,Convert.ToDecimal
和ToSingle
中的ToDouble
,我使用了Foreach
CultureInfo
类的数组,但是,有没有一种方法可以检测哪些是可能的文化"从一个字符串? (我说可能的文化,因为一些文化共享他们的格式。)
示例:如果我使用" 1,080.47"我想返回en-US
,如果我使用" 1.080,47"我想返回fr-FR
,es-ES
等
你推荐什么?
答案 0 :(得分:2)
相同的数字格式可能与各种文化有关,所以也许我错了,但我想你能做的最好的事情就是匹配特定格式的有效文化,然后用你自己的逻辑来决定,这样的事情只是 Single 的一个例子:
Public Function MatchCultures(ByVal str As String) as list(of string)
Dim ValidCultures As New List(Of String)
Dim CultureNames As IEnumerable(Of String) =
From cultureInfo In cultureInfo.GetCultures(CultureTypes.AllCultures)
Select cultureInfo.Name
For Each CultureName As String In CultureNames
Try
Convert.ToSingle(str, New CultureInfo(CultureName))
ValidCultures.Add(CultureName)
Catch ex As FormatException
' Do nothing
End Try
Next
Return ValidCultures
End Function
如果你想将CultureNames限制在一个特定的范围内,你可以加快程序,我们可以说{" en-Us"," fr"," es& #34;等等...}'因为文化名称列表太大了:http://msdn.microsoft.com/es-es/goglobal/bb896001.aspx
无论如何我认为你正在将问题变成一个糟糕的解决方案,你应该使用" TryParse"来自数据类型的辅助方法,如:
If Single.TryParse("1.000", New Single) Then...
答案 1 :(得分:0)
为了清楚起见,我引用MSDN
*在.NET Framework 4 和以前的版本中,默认情况下,所有线程的文化都设置为Windows系统文化*
然而,输入和输出之间存在区别。我将从琐碎的部分开始。
<强>输出强>
这很容易。 我们控制住了。如果用户想要,
作为小数分隔符,则应该这样做。
decimalValue.ToString(123.456, CultureInfo.GetCultureInfo("nb-NO"))
输出:
123456
<强>输入强>
这是棘手的部分。我是挪威人(因为我猜你已经弄明白了),是的,我们使用逗号(,
)作为小数点分隔符。这是否意味着我的所有人都会输入,
而不是.
? 否即可。所以适用于日期。有些用户输入 dd-MM-yyyy &#34;而不是&#34; of dd.MM.yyyy 。欢迎来到UXD。但是(对于其他人来说可能不是这样),我还没有看到用户在使用浮动数字时尝试输入thousand separator
。
<强>结论强>
我最好的建议是使用默认的文化信息作为输出,并且如果无效,请格式化用户输入,如果无效。
注意强>
仅供参考,文化信息揭示了许多有用的属性。这里有一些与我的问题有关: