C#:更改Regex的NumberDecimalSeparator

时间:2018-04-17 08:05:32

标签: c# regex parsing numbers

我使用正则表达式使用小数分隔符解析十进制值,采用美国格式,如: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");

但它似乎不会影响正则表达式,它仍然希望逗号作为小数分隔符。

2 个答案:

答案 0 :(得分:1)

  

为了便于阅读和简化,我想坚持\d。我可以强制它将点识别为小数点分隔符吗?

不,这是因为\d[0-9]的简写。它与其他任何东西都不匹配,包括分隔符。

如果你想匹配小数,你需要这样的东西:

-?\d+(\.\d+)?

Demo

答案 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(...) 更好