0

每次用户按下按钮时,我希望每 3 个字符添加一个点,例如:

123
123.456
12.345.678

我希望每次按下键时都会发生这种情况,这就是我所拥有的,但没有运气......

function format_num(input) {
    str = input.value;
    str.replace(/(.{3})/,'$1.')
    input.value = str;
}

<input type="text" name="num" id="num" onKeyPress="format_num(this)">
4

4 回答 4

1

首先,您的正则表达式后缺少一个分号。其次,您必须添加g修饰符来查找所有匹配项,而不是停留在第一个匹配项上。此外,将 的结果分配给.replace()变量,甚至是变量str本身。

str = str.replace(/(.{3})/g,"$1.");

这是因为在 Javascript 中字符串是不可变的:这意味着所有String方法实际上都不会更改内容字符串,而是返回一个新的修改后的字符串。

最后一个警告:您会注意到,当您添加点时,此正则表达式将不再起作用,因为您将在点之间添加点。

您必须避免计算字符串中的点。您可以通过在执行 Regex 之前修改变量来做到这一点;这条线上的东西:

str = str.split('.').join('');

Working example

于 2013-07-31T15:38:53.447 回答
0

您必须从右向左扫描。一个更具可读性(与 Utkanos 相比)的解决方案是

function format_num(input) {
    var inStr = input.value.replace(/\./, '');
    var outStr = '';
    for (var count=0, i=inStr.length-1; i>=0; i--, count++ ) {
        if ( count && count % 3 == 0 ) outStr = '.' + outStr;
        outStr = inStr.charAt(i) + outStr;
    }

    input.value = outStr;
}
于 2013-07-31T16:05:29.963 回答
0

我发现这个脚本完美无缺!!我的答案有一些问题,所以我看了看,想出了这件作品……无论如何,谢谢!

function formatNumber( originalValue ){

    originalValue = ( originalValue != null ? originalValue.toString() : "0" );

    var nStr = originalValue.replace( /\./g, "" );
    var jj=0;
    var leftNumbers = 0;

    var x = nStr.split(',');
    var x1 = x[ 0 ];
    var x2 = x.length > 1 ? ',' + x[ 1 ] : '';
    var rgx = /(\d+)(\d{3})/;

    while( rgx.test( x1 ) ){
        x1 = x1.replace( rgx, '$1' + '.' + '$2');
    }

    nStr = x1 + x2;

    for( jj=0; leftNumbers>0; jj++ ){

        if( /[0-9]/.test( nStr.toString().substring( jj, ( jj + 1 ) ) ) )
            leftNumbers--;

    }

    if( originalValue == nStr )
        return originalValue;

    return nStr;
}
于 2013-08-01T17:35:43.683 回答
0

这是我发布过的最可怕、最不可读的答案,但它确实有效,适用于任何数字。

var num = 12345678;
var formatted = num.toString().replace(/./g, function(num) { return num+'|'; }).split('|').reverse().join('').replace(/\d{3}/g, function(nums) { return nums+'.'; }).replace(/./g, function(num) { return num+'|'; }).split('|').reverse().join('').replace(/^\./, '');

生成 12.345.678

于 2013-07-31T15:47:21.983 回答