【问题标题】:Regular Expression Required for Validating Decimal Numbers验证十进制数所需的正则表达式
【发布时间】:2018-08-26 06:12:37
【问题描述】:

有人可以提供一个允许的正则表达式:

  • 小数点前最多 18 位
  • 小数点后两位数

有效值:18.50、5556.50 无效值:18.555、5879.5877 等。

【问题讨论】:

  • 您是否考虑过使用Decimal.TryParse,然后检查上限和精度?这适用于任何用户配置的文化,并确保在解析它时获得相同的值。在这种情况下,正则表达式非常不理想。 ASP.NET 范围验证器将允许类似的验证客户端:msdn.microsoft.com/en-us/library/f70d09xt(v=vs.71).aspx
  • 请记住,小数点 . 是荷兰和许多其他国家/地区的千位分隔符,我们使用 , 表示分数,. 表示千位分隔符。正则表达式过于固定,无法正确支持国际化。

标签: c# .net regex vb.net visual-studio-2010


【解决方案1】:

我会这样做:

\b\d{1,18}\.\d{1,2}\b
  • \b 捕获单词边界;如果您将正则表达式括在两个 \b 之间,您将搜索限制为单词,即由空格、标点符号等分隔的文本。
  • \d 捕获数字
  • \d{1,18} 至少捕获 1 位,最多 18 位
  • \. 捕获一个点;您必须在前面加上反斜杠来转义点字符,因为它是正则表达式引擎的特殊符号,用于捕获所有内容
  • \d{1,2} 至少捕获 1 位,最多 2 位

现场演示here,您可以随意测试。

【讨论】:

  • 为链接添加了书签。也为 c# 生成代码!谢谢。
  • 感谢您的解释。
【解决方案2】:

要匹配小数点前最多 18 位数字,您可以使用 \d{1,18}。要匹配小数点后的 2 位数字,您可以使用 \d{2}

您的正则表达式可能如下所示:

\b\d{1,18}\.\d{2}\b

那会匹配:

  • \b字边界
  • \d{1,18} 匹配一个数字 1-18 次
  • \.匹配一个点
  • \d{2} 匹配 2 位数字
  • \b字边界

【讨论】:

    【解决方案3】:

    对于验证输入,您无需在正则表达式中使用 \b

    这会对你有所帮助:

    ^\d{1,18}\.\d{1,2}$
    

    有了这个Demo

    【讨论】:

      【解决方案4】:

      谢谢大家! 我想我刚刚开发了一些比创建正则表达式更简单的东西。这是我所做的:

      Dim mrp_point As Integer = 0
      Dim mrp_decimal_count As Integer = 1
      Private Sub txtMRP_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtMRP.KeyPress
          If mrp_decimal_count < 2 Then
              If mrp_point = 0 Then
                  e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = "." Or Asc(e.KeyChar) = 8)
                  If Not txtMRP.Text = "" Then
                      Dim mrp As String = txtMRP.Text
                      Dim last As Char = mrp(mrp.Length - 1)
                      If last = "." Then
                          mrp_point = 1
                      End If
                  End If
              ElseIf mrp_point = 1 Then
                  e.Handled = Not (Char.IsDigit(e.KeyChar) Or Asc(e.KeyChar) = 8)
                  mrp_decimal_count = mrp_decimal_count + 1
              End If
          Else
              e.Handled = Not (e.KeyChar = " " Or Asc(e.KeyChar) = 8)
          End If
      End Sub
      

      无论如何,感谢您的时间和帮助! :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-02
        • 1970-01-01
        • 2018-03-02
        • 1970-01-01
        • 2014-07-02
        • 2023-03-08
        相关资源
        最近更新 更多