2014-01-05 62 views
2

我需要驗證的輸入值,0〜99.99,浮子式,和小數點後只有兩位數字,像驗證輸入的浮點格式

有效例如:

0 
1 
.1 
.12 
12.12 

無效例如:

(empty) 
100 
123.1 
.123 
12.123 

所以我創建這個正則表達式

var isValid = new RegExp(/^\d{1,2}(\.\d{0,2})?$/).test(parseFloat($('#myText').val())); 

任何其他方式檢查?使代碼更容易和更簡單。

+0

023.1呢?它應該被認爲是有效的嗎?承認前導零將是有意義的。 – user2314737

+0

是的,你的建議是必要的。我認爲023意味着23! – Kevin

回答

2

您可以嘗試使用正則表達式:

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

regex101 demo

的正則表達式是兩個部分:

^\d{1,2}(?:\.\d{1,2})?$這將接受數字與2位,一個可能的小數的最多兩個十進制數字。

^的行的開頭相匹配,

\d{1,2}任何數量的匹配至少1時間和至多2倍。

(?: ...)是非捕獲組(這使得正則表達式稍微更有效的通過不必保持捕獲的組)

?近終點指示0或1次,

$指示結束的線(從而確保沒有更多的號碼)。

第二部分^\.\d{1,2}$接受第一位可以不存在的小數,因此.1將通過。

第一和第二部分與|(或運營商)連接,這意味着,如果比賽爲第一部分出現故障時,發動機將與第二部分嘗試稱這是一個不匹配的

+0

似乎更復雜。但可能更強大。良好的網站btw。 – Kevin

+0

@凱文謝謝。這不是比第一個答案更復雜,你會注意到他們的正則表達式改變了很像我的;) – Jerry

+0

是的,最初我看着凱文的正則表達式,並認爲它看起來是正確的,所以我的答案專注於其他事情,但他的評論(在我的回答下)促使我看得更仔細一些。 +1正確的第一個得到正則表達式。 – nnnnnn

2

「使代碼更簡單。」

好的。在這裏你去:

var isValid = /^\d{1,2}(\.\d{0,2})?$|^\.\d\d?$/.test($('#myText').val()); 

你並不需要使用new RegExp()當你已經有一個字面正則表達式。

您的正則表達式不接受.作爲第一個字符。

如果您將parseFloat()的結果傳遞給.test(),那麼您不驗證用戶實際輸入的內容,因爲parseFloat()忽略了前導空格和尾隨非數字數據。所以你的代碼會接受,例如," 12abc"有效。如果你真的希望忽略前導空間或尾隨空間,你可以在你的正則表達式中使用。

+0

聽起來不錯。我現在感覺好多了。內部正則表達式腳本怎麼樣? – Kevin

+0

我錯過了什麼嗎?從什麼時候開始在JavaScript中定義變量的數據類型? –

+0

謝謝@MicahHenning - 顯然我只是從問題中複製出來而沒有考慮它。固定。 – nnnnnn

0

這裏之前是一個正則表達式,也接受前導和尾隨零:http://regex101.com/r/hV1uD8

/^(?:0*\d{1,2})(?:\.\d{0,2}0*)?$|^(?:0*\.)(?:\d{1,2}0*)$/ 

有效例子:

0 
1 
.1 
.12 
12.12 
23.1 
023.1 
12.1200 
012.120 
1. 
1.010 

無效:

100 
123.1 
.123 
12.123 
12.1201 

或者你可以使用parseFloat採取的開頭和結尾的零和關懷然後正則表達式中的其他答案建議:

var isValid = /^\d{1,2}(?:\.\d{1,2})?$|^\.\d{1,2}$/.test(parseFloat($('#myText').val())); 

但是這肯定是因爲你會效率低解析相同的表達式兩次。

+0

我認爲使用parseFloat可能會使代碼變得微不足道。但是當我parseFloat('023')我得到了'19'。它似乎不是我想要的! – Kevin

+0

所以,也許我應該在正則表達式測試之前修剪('0')。 – Kevin