我使用正则表达式使用小数分隔符解析十进制值,采用美国格式,如:2.56
但我的系统文化小数点分隔符设置为逗号,所以当我使用十进制类\ d时,正则表达式无法识别" 2.56"作为有效的十进制数。
为了便于阅读和简化,我想坚持使用\ d。我可以强制它将点识别为小数点分隔符吗?
使用float.TryParse()时,我可以强制使用dot作为小数分隔符:
var usCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-US");
float.TryParse(text, System.Globalization.NumberStyles.Number, usCulture, out s )
我可以为正则表达式执行类似的操作吗?
我尝试改变当前线程的文化:
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
但它似乎不会影响正则表达式,它仍然希望逗号作为小数分隔符。
答案 0 :(得分:1)
为了便于阅读和简化,我想坚持
\d
。我可以强制它将点识别为小数点分隔符吗?
不,这是因为\d
是[0-9]
的简写。它与其他任何东西都不匹配,包括分隔符。
如果你想匹配小数,你需要这样的东西:
-?\d+(\.\d+)?
答案 1 :(得分:1)
好吧,\d
是任何unicode 数字,而不是浮点数。如果你坚持使用正则表达式,你必须手动构建模式;在最简单的情况下(没有指数部分,没有千位分隔符,任意长度等),它可以是
string escapedSeparator = Regex.Escape(
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
string pattern = $"^-?[0-9]+({escapedSeparator}[0-9]+)?$";
if (Regex.IsMatch("-123.456", pattern)) {
...
}
我真的怀疑它是否比为此专门设计的double.TryParse(...)
1>更好