如何禁止逗号作为小数分隔符
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 中使用逗号作为小数分隔符的浮点格式?
当某些行包含逗号作为千位分隔符和“标志并且没有小数的行没有标志时如何在R中读取数据