我正在用德国文化设置编写代码
尽管如此,我想强制用户将该点用作小数点分隔符。
我的测试代码输出错误的值。
如何检测“错误”逗号?(抛出异常)
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
答案 0 :(得分:3)
首先关闭,请原谅我,我想质疑你的设计决定:
这如何增强用户体验?应用程序应该尝试接受所有明确的用户输入,而不是拒绝理论上的声音输入。
那就是,像“19,2”这样的数字将被解释为具有不变的文化,因为它具有千位分隔符(简单地被丢弃)。这就是您的代码静默生成错误值的原因。如果您想明确禁止此输入,最简单的方法是进行明确的测试:
if (nok_str.Contains(","))
throw new FormatException(…);
作为替代方法,您可以尝试修改传递给NumberFormatInfo
方法的自定义Parse
对象的NumberFormatInfo.NumberGroupSeparator
属性。
答案 1 :(得分: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。
答案 2 :(得分:0)
我不确定您输入的来源是什么。
如果它来自用户,它还取决于...如果是GUI应用程序,您可能会考虑将输入限制为某些可能的键,不包括逗号。如果它是一个控制台应用程序,您可以尝试使用正则表达式来预验证输入字符串。
如果来自各种来源(即网络服务),可能只是蛮力字符串替换就可以了?
最后,但并非最不重要:有解析文化敏感的原因,如果我是你,我会鼓励用户输入有效的区域数字格式,而不是强迫他们提供不正确的格式。