【问题标题】:String to Numeric conversion and group separator字符串到数字的转换和组分隔符
【发布时间】:2010-03-05 12:40:01
【问题描述】:

当我尝试使用 Parse 或 TryParse 或 Convert.ChangeType 将字符串转换为数值时,我无法管理系统中定义的千位分隔符:

如果我输入:

var d = double.Parse("1,234", CultureInfo.CurrentUICulture);

它不返回 1234。

如果我想使用分组分隔符,我必须输入:

var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture);

这一次,结果如预期。

但是,我不想强​​制使用千位分隔符,我只想在系统在全球化设置中指定它时使用它。有没有办法知道是否使用了分隔符(我知道我可以在CultureInfo.CurrentUICulture.NumberFormat.NumberGroupSeparator中读取组分隔符)

干杯 逻辑

【问题讨论】:

    标签: c# parsing cultureinfo


    【解决方案1】:

    拥有Number(包括AllowThousands)并不要求逗号 - 它只是允许它。所以你可以使用Number 带或不带逗号。或使用AnyAllowThousands

    请注意,“逗号”可以与“千位分隔符”交换 - 即在某些 Eurupe 中,它可能会有所不同(句号等)。如果您意思是“逗号是千”,则使用固定的文化(例如InvariantCulture)。

    【讨论】:

    • 我同意。但我的问题是(断言文化是 'fr-FR' 并且千位分隔符是空格字符),为什么:以下行有效: double d = (double)Convert.ChangeType("1 234", typeof (double), _文化);虽然以下行引发格式异常? int i = (int)Convert.ChangeType("1 234", typeof (int), _culture);
    【解决方案2】:

    你总是可以使用你使用的第二行

    var d = double.Parse("1,234", NumberStyles.Number, CultureInfo.CurrentUICulture);
    

    因为它可以正确转换 1234 和 1,234,并且它应该涵盖使用 '.' 的系统上的 1.234作为组分隔符

    【讨论】:

    • 是的,但实际上,我想使用 Convert.ChangeType 函数将通用字符串转换为数字转换器,并将其作为字符串扩展名提供。但是 Convert.ChangeType 没有 NumberStyles 参数的重载。它只允许一个 IFormatProvider 参数。顺便说一句,我不明白为什么 Parse 的默认设置不符合我的系统国际设置,其中设置了使用组分隔符。
    【解决方案3】:

    您应该使用CurrentCulture 而不是CurrentUICulture 解析用户输入。

    属性CurrentUICulture 指的是显示用户界面的语言,CurrentCulture 指的是Windows 中指定的当前区域设置。这样,使用提供翻译成英文 (CurrentUICulture) 的用户界面的应用程序的用户仍然可以查看/输入,例如,日期和数字格式为他在 Windows 中设置的区域设置 (CurrentCulture)。

    【讨论】:

    • 您好,感谢您的帮助。我的应用程序使用户能够在运行时更改语言(我们提供 7 种不同的语言)。当用户选择一种语言时,我们会更改 CurrentUICulture 和 CurrentCulture。我们希望用户查看/输入日期和数字作为所选语言,而不是系统中设置的区域设置。
    猜你喜欢
    • 2019-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 2012-11-08
    • 1970-01-01
    相关资源
    最近更新 更多