【问题标题】:Regex query to validate a currency string C#?正则表达式查询以验证货币字符串 C#?
【发布时间】:2021-03-16 21:07:42
【问题描述】:

我绝不是Regex 的大师,这就是我在这里的原因我目前有这个:

\s?[^0-9]?\s?[0-9,]+([\\.]{1})?[0-9]+\s?

Link 到 regex101

为了解释我的验证尝试,我试图验证一个字符串是否匹配正确的格式结构。

我只想匹配字符串,例如:

  • 1.00 英镑
  • 10.00 英镑
  • 100.00 英镑
  • 1000.00 英镑
  • 10,000.00 英镑
  • 100,000.00 英镑
  • £1,234,546.00

验证规则

  • 字符串必须以“£”开头。
  • 字符串应始终在小数点后保留 2 位数字。
  • “£”后面只能接受 0-9 之间的数字
  • 如果字符串长度大于 6(在 £1000.00 之后),则需要在适当的位置输入逗号(即 £10,000.00 - £100,000.00 - £1,000,000.00 - £10,000,000.00 等)

例如,不应接受的字符串:

  • 1 英镑
  • 10.000 英镑
  • 1,00.00 英镑
  • 1,000.00 英镑
  • 10,000.00
  • 100,000,00 英镑
  • 1.234.546 英镑

真的希望你们中的一个了不起的人可以帮助我,如果您需要更多信息,请告诉我!

【问题讨论】:

  • 这些特定的验证规则是否有原因?看来您可以使用 decimal.TryParse(string. System.Globalization.NumberStyles, IFormatProvider, out decimal) 而不是正则表达式。如果您这样做,您说应该失败的大多数示例都会成功,但我不确定为什么会出现问题。例如,为什么£1 会失败?那不应该只是£1.00吗? £10.000 不应该只是 £10.00 吗?
  • 验证规则与工作相关,如果测试数据显示£1字符串作为基金值,则表明格式存在问题,这需要反映在自动化测试。

标签: c# regex validation currency-formatting


【解决方案1】:

你可以试试pattern below:

  ^£(?:[0-9]{1,4}|[0-9]{2,3},[0-9]{3}|[0-9]{1,3}(?:,[0-9]{3}){2,})\.[0-9]{2}$

当便士是强制性 - \.[0-9]{2} 我们有 3 个英镑选项:

  [0-9]{1,4}                   for sums in range £0 .. £9999
  [0-9]{2,3},[0-9]{3}          for sums in range £10,000 .. £999,999
  [0-9]{1,3}(?:,[0-9]{3}){2,}  for huge sums     £1,000,000 ..

演示:

  using System.Linq;
  using System.Text.RegularExpressions;

  ...

  Regex regex = new Regex(
    @"^£(?:[0-9]{1,4}|[0-9]{2,3},[0-9]{3}|[0-9]{1,3}(?:,[0-9]{3}){2,})\.[0-9]{2}$";

  string[] tests = new string[] {
    "£1.00",
    "£10.00",
    "£100.00",
    "£1000.00",
    "£10,000.00",
    "£100,000.00",
    "£1,234,546.00",

    "£1",
    "£10.000",
    "£1,00.00",
    "£1,000.00",
    "10,000.00",
    "£100,000,00",
    "£1.234.546",
  };

  string report = string.Join(Environment.NewLine, tests
    .Select(test => $"{test,15} : {(regex.IsMatch(test) ? "Match" : "Fail")}"));

  Console.Write(report);

结果:

          £1.00 : Match
         £10.00 : Match
        £100.00 : Match
       £1000.00 : Match
     £10,000.00 : Match
    £100,000.00 : Match
  £1,234,546.00 : Match
             £1 : Fail
        £10.000 : Fail
       £1,00.00 : Fail
      £1,000.00 : Fail
      10,000.00 : Fail
    £100,000,00 : Fail
     £1.234.546 : Fail

【讨论】:

  • 你先生是神!您是否偶然知道一个我可以在 Regex 上阅读的好地方,我希望能够正确使用它,但语法对我来说是陌生的?
  • @HermanCodes:有很多正则表达式教程,例如regexone.com
  • 非常感谢,如果可以的话,我会投票给你:D
【解决方案2】:

这个呢?

new Regex(@"£\d{1,3}(\,\d{3})*\.\d{2}\b");

编辑:

new Regex(@"£((\d{1,4})|(\d{2,3}(\,\d{3})+)|(\d(\,\d{3}){2,}))\.\d{2}\b");

https://regex101.com/r/zSRw2B/1

【讨论】:

  • 这太接近我需要的了。 regex101 只是匹配错误的 1000.00 英镑。它应该匹配 1000.00 英镑而不是 1,000.00 英镑。你能改变它让我匹配吗? @alex-dl
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多