【问题标题】: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

【问题讨论】:

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

标签: c# .net


【解决方案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 服务),也许简单的暴力字符串替换就可以解决问题?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-10
      • 1970-01-01
      • 2017-09-30
      • 2014-07-16
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多