是否可以告诉 C# 将字符串解析为十进制,但只有当字符串仅包含点(或不包含点,但不包含逗号等)时才能成功?或者我是否必须在字符串输入上使用正则表达式来验证此条件?
// should be parsed and is parsed successfully as 1.0
var test1 = decimal.Parse("1.0", new NumberFormatInfo() { NumberDecimalSeparator = "." });
// should throw an error, but is parsed as 10
var test2 = decimal.Parse("1,0", new NumberFormatInfo() { NumberDecimalSeparator = "." });
decimal.Parse()
的重载来允许 NumberStyles
参数执行此操作:
var test2 = decimal.Parse(
"1,0",
NumberStyles.AllowDecimalPoint,
new NumberFormatInfo { NumberDecimalSeparator = "." }
);
这会抛出异常。或者您可以对
TryParse()
执行相同操作并检查返回值,以避免必须处理异常。
您可以使用正则表达式来验证输入字符串。 此正则表达式允许在开头使用可选的加号或减号,后跟数字和可选的点(句点)作为小数分隔符。 它不允许使用逗号。
string pattern = @"^[+-]?\d*\.?\d*$";
问题是,
NumberFormatInfo.NumberGroupSeparator
的默认值设置为,
。因此,在解析过程中 ,
的所有实例都将被忽略。如果你这样做你就可以看到这个
var s = "1f0";
var d = decimal.Parse(s, new System.Globalization.NumberFormatInfo{ NumberGroupSeparator = "f"});
它还会将字符串解析为值
10
...
如果是这样的话
var d = decimal.Parse(s, new System.Globalization.NumberFormatInfo{ NumberGroupSeparator = ""});
如果您的字符串包含逗号,它将引发错误。但它仍然会解析该字符串,并且所有其他默认值
NumberStyle
仍然存在。