2012-02-08 267 views
2

我想寫一個RegEx來驗證一個浮點數。下面是我迄今管理:浮點正則表達式?

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

數量是有效的,如果:

  • 或正或負
  • 最大的2個位數(幾十或幾百)
  • 百分位數字可't 0(僅1-9)
  • 比例最大爲1
  • 小數值可以是0或5或根本沒有

所以這些數字將是有效的,爲前:

  • 1.5
  • -1.5
  • 17.5
  • -3
  • 30.5

這些數字將是inv alid,爲前:

  • 1.57
  • 3041.5
  • 17.59
  • -1.56
  • 05.0
+0

.5會有效嗎? – ggreiner 2012-02-08 01:53:15

+0

正則表達式是這個的正確工具嗎? – alex 2012-02-08 01:54:10

+0

爲什麼要對構成浮動的構成進行人爲限制? – Dave 2012-02-08 01:58:21

回答

2

正如我在評論中說的 - 你的第一個非零數字會算的話,你加兩個 - 現在讓三位數字如915。爲了解決這個問題的正則表達式的方式(with your testcases):

^[+-]?(?:(?!0)\d{1,2}|0)(?:\.[05])?$ 

我使用負前瞻(?!0)以確保第一個數字是不是零,那麼就需要對想要選擇的位數。它也允許0.5和類似的通過|0析取。如果你喜歡.5,這將是這樣的:

^[+-]?(?!0)\d{,2}(?:\.[05])?$ 

如果你想禁止3.0(由你的規則允許的),只允許3(如你的例子暗示),取代的最後一部分:

^[+-]?(?:(?!0)\d{1,2}|0)(?:\.5)?$ 

但是,這比@ Arkku的漂亮的Float(number)可讀性差得多;使用正則表達式,如果你真的需要它們。

7

如何Float(number)(捕獲異常檢測分析錯誤)然後驗證浮點數?對於幾個屬性,這比編寫正則表達式要容易一些。如果您需要強制使用Ruby接受的語法子集(爲什麼?),請僅使用正則表達式檢查該部分。

+0

你能告訴我們如何才能捕捉到類似Float(「xyz」)拋出異常時引發的異常 – 2016-02-01 11:30:05

+0

@AdityaSanghi'begin' /'rescue'像往常一樣,在' irb'顯示'Float(「xyz」)'拋出'ArgumentError'。 – Arkku 2016-02-01 12:23:12

+0

是對ArgumentError的救援工作。謝謝 – 2016-02-03 09:07:06

0

下面是對正則表達式驗證彩車整體網頁:http://www.regular-expressions.info/floatingpoint.html

這就是說,

  • {1,1}相當於{1}這相當於沒有把它所有,因此你可以將其刪除
  • 如果您想確保0.5xyz未通過,請在末尾添加$

隨着上述變化,它會是這樣的:/^[-+]?[1-9]\d{0,2}(\.\d)?$/

0
/^[-+]?\d{0,2}(\.[05])?(?!\d)$/ 

匹配時:

  • 值是正或負

  • 幅度小於100中的(-99.5 to 99.5)

  • 十進制值的範圍是.0.5或不存在(換句話說,.0.5,或缺失)

因此,這些數字將是有效的,爲前:

1.5 -1.5 17.5 15 -3 30.5 -10.0 99.5

這些數字將無效,例如:

1.57 3041.5 17.59 915 -1.56 05.0 99.6