【问题标题】:Detect IFormatProvider or CultureInfo from String using VB.NET使用 VB.NET 从字符串中检测 IFormatProvider 或 CultureInfo
【发布时间】:2014-08-08 19:44:28
【问题描述】:

好吧,为了在Convert.ToDecimal、ToSingle 和ToDouble 中避免Format Exceptions,我使用Foreach 和CultureInfo 类数组,但是,是有一种方法可以从字符串中检测哪些是“可能的文化”? (我说可能的文化是因为某些文化共享它们的格式。)

一个示例:如果我使用“1,080.47”我想返回en-US,如果我使用“1.080,47”我想返回fr-FR、es-ES等。

你有什么推荐的?

【问题讨论】:

  • 对不起! ^^(我忘了)
  • 在什么情况下en-US 应用程序会显示fr-FR 十进制值? (试图阻止 XY 循环赛......)

标签: .net vb.net string format cultureinfo


【解决方案1】:

相同的数字格式可能适用于不同的文化,所以也许我错了,但我想你能做的最好的就是匹配特定格式的有效文化,然后使用你自己的逻辑来决定,比如这只是 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”等...} '导致文化列表-names 太大:http://msdn.microsoft.com/es-es/goglobal/bb896001.aspx

无论如何,我认为您正在将问题解决为一个糟糕的解决方案,您应该使用来自以下数据类型的“TryParse”辅助方法:

If Single.TryParse("1.000", New Single) Then...

【讨论】:

    【解决方案2】:

    为了清楚起见,我会引用MSDN

    *在.NET Framework4和以前的版本中,默认情况下,所有线程的文化都设置为Windows系统文化*

    但是,输入和输出之间是有区别的。我将从琐碎的部分开始。

    输出

    这是最简单的。 我们在控制之中。如果用户想要一个, 作为小数分隔符,那么应该这样做。

    decimalValue.ToString(123.456, CultureInfo.GetCultureInfo("nb-NO"))
    

    输出:

    123,456

    输入

    这是棘手的部分。我是挪威人(我猜你已经知道了),是的,我们使用逗号 (,) 作为小数分隔符。这是否意味着我所有的伙伴都会输入,而不是.? 否。所以适用于日期。一些用户输入 dd-MM-yyyy “而不是” dd.MM.yyyy。欢迎来到UXD。但是(对其他人来说可能并非如此),我还没有看到用户在使用浮点数时尝试输入thousand separator。


    结论

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

    注意

    仅供参考,文化信息揭示了许多有用的属性。以下是一些与我的anwwer相关的内容:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多