2012-04-24 74 views
4

我需要使用Javascript驗證一些包含巴西貨幣(名稱爲「Real」)的表單文件。它有以下格式:使用Javascript驗證巴西貨幣的正則表達式

  0,01 
      0,12 
      1,23 
      12,34 
      123,45 
     1.234,56 
     12.235,67 
     123.456,78 
    1.234.567,89 
    12.345.678,90 
    123.456.789,01 
1.234.567.890,12 

我的正則表達式知識很薄弱,有人可以幫我嗎?

回答

9

這是否做自己想?

^\d{1,3}(?:\.\d{3})*,\d{2}$ 

即說「1至3位數,任選地隨後通過任何數目的由一個週期前三個數字組,跟一個逗號和兩個多個數字。」如果你想允許空格出現在您的示例中的龍頭,加上\s*到前面:

^\s*\d{1,3}(?:\.\d{3})*,\d{2}$ 

編輯:由於@ElRonnoco指出,上述正則表達式接受前導零(例如010.100,00)。要禁止這些,你可以使用這個更長的版本:

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

EDIT 2上述正則表達式匹配所有含有單一的貨幣量並沒有別的字符串。從這個問題來看,這是不是意圖。

編輯3爲了讓那些沒有小數部分的數字,或只有一個十進制數,改變這樣的:

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

+1這將接受前導零,但例如'01.000.000,00' – 2012-04-24 15:54:30

+0

@MarkReed :在最新的正則表達式中丟失一個括號:'(?:[1-9] \ d {0,2})(?:\。\ d {3})* | 0),\ d {2}'問題:預計正則表達式中的「| 0」部分是什麼? – 2012-04-24 16:02:42

+0

@Joanna - 不,結束括號是| 0後面的那個。這允許形式像前兩行(「0,01」,「0,10」),否則這些新的正則表達式會被0從0開始。 – 2012-04-24 16:06:30

2

我想給這個表達式一試:

\d+(?:\.\d{3})*?,\d{2} 

什麼它說的是:
- 比賽的數字,直到
一個。發現一個點後跟3位數字(並且該步驟可以重複多次)
b。或者逗號後2個位數發現

編輯:
- 感謝您的意見,我忘了約束前值爲
更新的正則表達式

\d{1,3}(?:\.\d{3})*?,\d{2} 
+2

注意,該接受任意數量的沒有分組的數字。所以這取決於OP的嚴格程度.. – 2012-04-24 15:31:50

+0

正如馬克所說,這將接受'12345.123,00'例如,有效 – 2012-04-24 15:56:44