簡體   English   中英

使用小數分隔符和千位分隔符驗證小數

[英]validate decimal with decimal separator and thousand separator

嗨,我使用此正則表達式驗證帶有小數點分隔符和千位分隔符的數字

ets = "\\,";
eds = "\\.";
"^([+\\-]?[0-9" + ets + "]*(" + eds + "[0-9]*)?)$"

但是我的兩個單元測試用例fail (它不應該接受)

12.1,,2 ,有人可以幫助嗎?

注意:這項工作為1..2

讓我們看一下使用的實際正則表達式:

^([+\-]?[0-9\,]*(\.[0-9]*)?)$

這符合12.因為你的第二部分是(\\.[0-9]*) 請注意, *表示零或更多,因此數字是可選的。

這也匹配1,,2因為你在第一個字符類[0-9\\,]包含了逗號。 所以實際上你的正則表達式也會匹配,,,,,,,,


這可以在沒有正則表達式的情況下解決,但是如果你需要一個正則表達式,你可能想要這樣的東西:

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

細分:

^ # match start of string
 [+-]? # matches optional + or - sign
 [0-9]{1,3} # match one or more digits 
 (,[0-9]{3})* # match zero or more groups of comma plus three digits
 (\. # match literal dot
  [0-9]+ # match one or more digits
 )? # makes the decimal portion optional
$ # match end of string

要在Java中使用它,你需要這樣的東西:

ets = ","; // commas don't need to be escaped
eds = "\\."; // matches literal dot

regex = "^[+-]?[0-9]{1,3}(" + ets + "[0-9]{3})*(" + eds + "[0-9]+)?$"

如果我理解正確,則12.匹配,因為您匹配0或1次出現(一個周期,然后0或多次出現0到9之間的任何數字)。 因此,您可能有一個句號,但前面沒有任何內容。

1,2,匹配,因為您匹配0到9之間的任何字符的0或更多出現,或逗號。 因此你可以有0 ,,,,,,,,,,,,,, 0。

如果你想讓最后一個不匹配,請確保在逗號之前最多只有3個數字(在千分隔符中),使用花括號表示一組后允許的次數(即{0,3})數字。

[0-9]{0,3},

@NullUserException剛剛提供了一個完整的正則表達式,適用於您的意圖

暫無
暫無

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

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