解析小数,但前提是仅使用小数点

问题描述 投票:0回答:3

是否可以告诉 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 = "." });
c# decimal
3个回答
2
投票

您可以使用

decimal.Parse()
的重载来允许
NumberStyles
参数执行此操作:

var test2 = decimal.Parse(
    "1,0", 
    NumberStyles.AllowDecimalPoint,
    new NumberFormatInfo { NumberDecimalSeparator = "." }
);

这会抛出异常。或者您可以对

TryParse()
执行相同操作并检查返回值,以避免必须处理异常。


0
投票

您可以使用正则表达式来验证输入字符串。 此正则表达式允许在开头使用可选的加号或减号,后跟数字和可选的点(句点)作为小数分隔符。 它不允许使用逗号。

string pattern = @"^[+-]?\d*\.?\d*$";

0
投票

问题是,

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
仍然存在。

© www.soinside.com 2019 - 2024. All rights reserved.