2017-02-28 32 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]; 
} 
相关问题