2017-02-28 68 views
0

我在javascript中使用以下函數。匹配一個十進制數字並替換javascript中的非數字字符

function chknumber(a) { 
    a.value = a.value.replace(/[^0-9.]/g, '', ''); 
} 

此函數替換在textbox上,其onkeyup我已要求上述函數輸入的任何非數字字符。問題是它允許這個字符串以及

1..1 

我希望該函數也可以替換第二個點字符。任何建議都會有所幫助。

回答

1

我不主張在人們試圖輸入時簡單地修改字段,而是用這樣的簡單處理程序來干涉他們正在做的事情,這很容易。 (之後進行驗證,或者使用一個編寫良好,經過全面測試的屏蔽庫。)當用戶輸入字段時更改字段的值時,會搞亂插入點的位置,這就是確實令人沮喪用戶。但是......

第二更換可以糾正..和這樣的:

function chknumber(a) { 
    a.value = a.value.replace(/[^0-9.]/g, '').replace(/\.{2,}/g, '.'); 
} 

,取代兩連勝更.有一個。 但是,它仍然允許1.1.1,你可能不想要。可悲的是,JavaScript沒有lookbehinds,所以我們進入更多的邏輯:

function chknumber(a) { 
    var str = a.value.replace(/[^0-9.]/g, '').replace(/\.{2,}/g, '.'); 
    var first, last; 
    while ((first = str.indexOf(".")) !== (last = str.lastIndexOf("."))) { 
     str = str.substring(0, last) + str.substring(last+1); 
    } 
    if (str !== a.value) { 
     a.value = str; 
    } 
} 

不能保證不會有其他邊緣情況和這樣的,又一次,每次分配的替代a.value,你將會弄亂用戶的插入點,這令人驚訝地令人沮喪。

所以,是的:後來驗證,或者使用一個寫得很好,經過全面測試的掩蔽庫。 (我有好運氣this jQuery plugin,如果你使用jQuery)


邊注:在您的原始替換第二''是不必要的; replace只使用兩個參數。

+0

這僅僅是連續兩個或更多'.'。要匹配十進制數字,它應該在第一次出現後替換所有'.'。 –

+0

@SanchayKumar:的確如此。我太專注於實際問題的內容,而不是其明顯的總​​體意圖。可悲的是,JavaScript沒有後視,這將使它變得如此簡單... –

+0

@SanchayKumar:現在更新它,但我仍然認爲這是錯誤的方法,以...開頭:-) –

1

嘗試匹配方法如果輸入是「sajan12paul34.22」的匹配函數將返回一個數組包含[12 , 34.22] 數組索引[0]被用於獲取第一數字值(12)

function chknumber(a) { 
    a.value = a.value.match(/[0-9]*\.?[0-9]+/g)[0]; 
} 
相關問題