簡體   English   中英

帶有小數和千位分隔符的數字的正則表達式

[英]Regex for number with decimals and thousand separator

我需要正則表達式來使用 javascript 驗證一個可能包含千位分隔符或小數的數字。 最大值為9,999,999.99最小值0.01其他有效值: 11,111 11.1 1,111.11

無效值: 1111 1111,11 ,111 111,

我沒有快樂地到處尋找。

/^\d{1,3}(,\d{3})*(\.\d+)?$/

關於最小值和最大值......好吧,我不會用正則表達式來做,但你可以在開始時添加前瞻:

/^(?!0+\.00)(?=.{1,9}(\.|$))\d{1,3}(,\d{3})*(\.\d+)?$/

注意:這允許0,999.00 ,因此您可能需要將其更改為:

/^(?!0+\.00)(?=.{1,9}(\.|$))(?!0(?!\.))\d{1,3}(,\d{3})*(\.\d+)?$/

這不允許前導 0。

編輯:
測試: http : //jsfiddle.net/pKsYq/2/

((\d){1,3})+([,][\d]{3})*([.](\d)*)?

它適用於一些,但我仍在學習正則表達式。

邏輯應該是 1-3 位數字 0-1 次,1 個逗號后跟任意次數的 3 位數字,以及單個 . 后跟任意數量的數字 0-1 次

Tezra 的公式對於“1”失敗。 或“1.0”。 出於我的目的,我允許前導和尾隨零,以及前導 + 或 - 符號,如下所示:

^[-+]?((\d{1,3}(,\d{3})*)|(\d*))(\.|\.\d*)?$

首先,我想指出,如果您擁有數據來自的表單,那么限制輸入的最佳方法是使用正確的表單元素(又名,數字字段)

<input type="number" name="size" min="0.01" max="9,999,999.99" step="0.01">

是否可以輸入“,”取決於瀏覽器,但瀏覽器總是會給你一個實際數字的值。 (請記住,所有表單數據也必須在服務器端進行驗證/清理。永遠不要相信客戶端)


其次,我想擴展更強大(獨立於平台)/可修改正則表達式的其他答案。

  • 您應該用 ^ 和 $ 將正則表達式括起來,以確保您匹配的是整個數字,而不僅僅是它的一個子集。 ^<my_regex>$
  • 小數點的右邊是可選的,所以我們可以把它放在一個可選的組中(<regex>)?
  • 匹配文字句點而不是任何數字鏈只是\\.\\d+
    • 如果你想堅持小數點后的最后一個數字不是 0,你可以使用[1-9]表示“非零數字”,所以\\.\\d+[1-9]
  • 對於小數點的左側,前導數字將為非零,或者數字為零。 所以([1-9]<rest-of-number-regex>|0)
  • 第一組數字將是 1-3 位數字,因此[1-9]\\d{0,2}
  • 之后,我們必須在 3s 中添加數字,所以(,\\d{3})*
    • 記住 ? 意味着可選,所以要使 , optional 只是(,?\\d{3})*

把這一切放在一起

^([1-9]\d{0,2}(,?\d{3})*|0)(\.\d+[1-9])?$

我在下面的正則表達式中使用了以下限制 -

^(?!0|\.00)[0-9]+(,\d{3})*(.[0-9]{0,2})$
  1. 不允許 0 和 .00。
  2. ','(千位分隔符)后 3 位。
  3. '.' (小數點最多保留 2 位小數)。

在最近的一個項目中,我們需要修改這個版本以滿足國際要求。 這是我們使用的: ^-?(\\d{1,3}(?<tt>\\.|\\,| ))((\\d{3}\\k<tt>)*(\\d{3}(?!\\k<tt>)[\\.|\\,]))?\\d*$

創建命名組(?<tt>\\.|\\,| )允許我們稍后使用負向預測(?!\\k<tt>)[\\.|\\,])以確保千位分隔符和小數點其實是不同的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM