如何禁止逗号作为小数分隔符

Posted

技术标签:

【中文标题】如何禁止逗号作为小数分隔符【英文标题】:How to prohibit comma as decimal separator 【发布时间】:2011-04-11 09:27:08 【问题描述】:

我正在使用德国文化设置编写代码

尽管如此,我还是想强制用户将该点用作小数分隔符。

我的一段测试代码输出了错误的值。

如何检测“错误”的逗号?(抛出异常)

string nok_str = "14,9";
string ok_str = "14.9";

double nok_Var1 = double.Parse(nok_str, CultureInfo.InvariantCulture.NumberFormat); // outputs 149.0
double nok_Var2 =Convert.ToDouble(nok_str, CultureInfo.InvariantCulture.NumberFormat); // outputs 149.0

【问题讨论】:

, 称为comma。 colon 是 : 您不必添加“NumberFormat”,只需 CultureInfo.InvariantCulture 就足够了。 在逗号示例中,千分位分隔符是什么? @Fosco:点,很明显。只需检查Console.WriteLine(CultureInfo.GetCultureInfo("de-DE").NumberFormat.NumberGroupSeparator); 【参考方案1】:

首先,请原谅我,我想质疑您的设计决定:

这如何增强用户体验?应用程序应该尝试接受所有明确的用户输入,而不是拒绝理论上合理的输入。

也就是说,在文化不变的情况下,诸如“19,2”之类的数字将被解释为具有千位分隔符(被简单地丢弃)。这就是为什么您的代码会默默地产生错误值的原因。如果您想明确禁止此输入,实现此目的的最简单方法是显式测试:

if (nok_str.Contains(","))
    throw new FormatException(…);

作为替代方法,您可以尝试修改您传递给Parse 方法的自定义NumberFormatInfo 对象的NumberFormatInfo.NumberGroupSeparator 属性。

【讨论】:

@lukas:据我了解,这个输入也应该被禁止。【参考方案2】:

基本上,默认值是在数字样式中包含 AllowThousands。如果你指定你想要的数字样式,你可以禁止这样:

using System;
using System.Globalization;

class Test

    static void Main(string[] args)
    
        string text = "19,2";
        double value;
        bool valid = double.TryParse(text, NumberStyles.Float,
                                     CultureInfo.InvariantCulture,
                                     out value);
        Console.WriteLine(valid); // Prints false
    

请注意,NumberStyles.Float 是 AllowLeadingWhite、AllowTrailingWhite、AllowLeadingSign、AllowDecimalPoint 和 AllowExponent 的复合样式 - 但不是 AllowThousands。

【讨论】:

【参考方案3】:

我不确定您输入的来源。

如果它来自用户,它也取决于... 如果它是 GUI 应用程序,您可能会考虑将输入限制为某些可能的键,不包括逗号。如果是控制台应用,可以尝试正则表达式对输入字符串进行预验证。

如果它来自各种来源(即 Web 服务),也许简单的暴力字符串替换就可以解决问题?

最后但并非最不重要的一点:解析是文化敏感的,如果我是你,我会鼓励用户输入有效的区域数字格式,而不是强迫他们提供不正确的数字格式。

【讨论】:

以上是关于如何禁止逗号作为小数分隔符的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Python Pandas 中使用逗号作为小数分隔符的浮点格式?

NumericUpDown:接受逗号和点作为小数分隔符

当某些行包含逗号作为千位分隔符和“标志并且没有小数的行没有标志时如何在R中读取数据

如何格式化数据库中的双精度数据并在 Android 上使用逗号作为小数分隔符设置到 Textview

以逗号作为小数分隔符的数据框

逗号作为小数分隔符空格作为千​​位分隔符C# [重复]