使用VB.NET从String中检测IFormatProvider或CultureInfo

时间:2014-08-08 19:44:28

标签: .net vb.net string format cultureinfo

,为了避免Format ExceptionsConvert.ToDecimalToSingle中的ToDouble,我使用了Foreach CultureInfo类的数组,但是,有没有一种方法可以检测哪些是可能的文化"从一个字符串? (我说可能的文化,因为一些文化共享他们的格式。)

示例:如果我使用" 1,080.47"我想返回en-US,如果我使用" 1.080,47"我想返回fr-FRes-ES

你推荐什么?

2 个答案:

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


<强>结论

我最好的建议是使用默认的文化信息作为输出,并且如果无效,请格式化用户输入,如果无效。

注意

仅供参考,文化信息揭示了许多有用的属性。这里有一些与我的问题有关:

  • CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
  • CultureInfo.CurrentCulture.DateTimeFormat.DateSeparator