C#检查字符串是否为值格式
我想知道是否有一种简单的方法来检查字符串是否是任何类型的值格式。这意味着数字1000可以用以下任何一种方式表示:C#检查字符串是否为值格式,c#,parsing,string-formatting,cultureinfo,C#,Parsing,String Formatting,Cultureinfo,我想知道是否有一种简单的方法来检查字符串是否是任何类型的值格式。这意味着数字1000可以用以下任何一种方式表示: 一千 1000.00 一千 1000.00 1000美元 我尝试了double.TryParse(value,NumberStyles.Any,CultureInfo.InvariantCulture,out n),但这不适用于前面带有货币符号的项目。所以我尝试了double.TryParse(value NumberStyles.Any | NumberStyles.allow
- 一千
- 1000.00
- 一千
- 1000.00
- 1000美元
double.TryParse(value,NumberStyles.Any,CultureInfo.InvariantCulture,out n)
,但这不适用于前面带有货币符号的项目。所以我尝试了double.TryParse(value NumberStyles.Any | NumberStyles.allowcurrencycombol,CultureInfo.InvariantCulture,out n)
,但这也不起作用
基本上,我想检查一个值是否可以被视为一个数值。您可以使用正则表达式 您可以使用以下代码接受您的案例
- 一千
- 1000.00
- 一千
- 1000.00
- 1000美元
string pattern = @"^\$?(\d{1,3}(\,\d{3})*(\.0{2})?)|(\d+(\.0{2})?)$"; Match result = Regex.Match("$100,000.00", pattern); if (result.Success) // your input is in format
- 不变文化不使用
$
作为其货币符号;它使用·
为解析选择正确的区域性是很棘手的。显然,最好使用最初用于设置值格式的文化。如果您知道使用的是哪种文化,那么您很幸运:)
默认情况下,除非指定了特定的区域性,否则将使用CurrentCulture
。当前区域性可以在每个线程的基础上被覆盖和设置,但它默认为主机操作系统的区域设置。在没有其他信息的情况下,CurrentCulture
是合理的第一猜测
我建议您将至少两个TryParse
调用组合在一起:一个用于CurrentCulture
(或者您对起源文化的最佳猜测),一个使用InvariantCulture
的回退。将AllowCurrencySymbol
包含在两者上。不变区域性不使用$
作为其货币符号。您可以连续尝试两个TryParse调用:一个用于当前区域性,另一个用于不变区域性。将AllowCurrencySymbol
同时包含在这两者上。调用的顺序取决于格式化值时您最希望使用的区域性。这取决于您的定义,但您可以轻松地去掉所有非数字字符,然后查看是否还有任何字符。类似于var isNumber=(新字符串($1234)。其中(c=>char.IsDigit(c)).ToArray()).Length>0)代码>@MikeStrobel不变量区域性使用什么作为货币符号?CurrentCulture如何准确工作?@Joe CurrentCulture默认使用主机系统的区域设置,但它可以被覆盖(并按线程设置)。它也是格式化值时默认使用的格式。不变量文化使用·作为其货币符号。好吧,那么我可能不想使用不变量。谢谢你能添加你的回复作为回答吗,请@MikeStrobel