2

私は、js 番号に千単位の区切り記号を追加するこの美しいスクリプトを見ました。

function thousandSeparator(n, sep)
{
    var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})'),
        sValue = n + '';
    if(sep === undefined)
    {
        sep = ',';
    }
    while(sRegExp.test(sValue))
    {
        sValue = sValue.replace(sRegExp, '$1' + sep + '$2');
    }
    return sValue;
}

利用方法 :

thousandSeparator(5000000.125, '\,') //"5,000,000.125"

ただし、 while ループを受け入れるのに問題があります。

正規表現を次のように変更することを考えていました:'(-?[0-9]+)([0-9]{3})*' アスタリスク...

しかし、今、どのようにreplaceステートメントを適用できますか?

今私は持っているでしょ$1$2..$n

置換機能を強化するにはどうすればよいですか?

psコードはここから取得されますhttp://www.grumelo.com/2009/04/06/thousand-separator-in-javascript/

4

5 に答える 5

5

あなたの仮定

今、私は $1 と $2 を持っています..$n

間違っている。ブラケットが 2 セットあるため、2 つのグループがあります。

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

そして、2 番目のグループを繰り返します。2回目に一致した場合は1回目の結果を上書きし、3回目に一致した場合は上書きして……

つまり、一致が完了すると$2、そのグループの最後の一致の値が含まれます。

最初のアプローチ

(\d)(?=(?:[0-9]{3})+\b)

と置き換えます

$1,

正規表現で見る

ドットの右側にもコンマが挿入されるという欠点があります。(私はそれに取り組んでいます。)

2 番目のアプローチ

(\d)(?:(?=\d+(?=[^\d.]))(?=(?:[0-9]{3})+\b)|(?=\d+(?=\.))(?=(?:[0-9]{3})+(?=\.)))

と置き換えます

$1,

正規表現で見る

そのため、もう少し複雑になっています。

(\d)                   # Match a digit (will be reinserted)
(?:
    (?=\d+(?=[^\d.]))  # Use this alternative if there is no fractional part in the digit
    (?=(?:\d{3})+      # Check that there are always multiples of 3 digits ahead
    \b)                # Till a word boundary
    |                  # OR
    (?=\d+(?=\.))      # There is a fractional part
    (?=(?:\d{3})+      # Check that there are always multiples of 3 digits ahead
    (?=\.))            # Till a dot
)

問題: 続く文字列の末尾がない場合、小数部にも一致します。

于 2012-05-16T05:43:32.923 に答える
1

これは、あなたの美しいスクリプトと対照的な醜いスクリプトです。

10000000.0001 .toString().split('').reverse().join('')
.replace(/(\d{3}(?!.*\.|$))/g, '$1,').split('').reverse().join('')

後読みがないので、文字列を逆にして代わりに先読みを使用することでごまかすことができます。

ここでも、より美味しい形で提供されます。

function thousandSeparator(n, sep) {

    function reverse(text) {
        return text.split('').reverse().join('');
    }

    var rx = /(\d{3}(?!.*\.|$))/g;

    if (!sep) {
        sep = ',';
    }

    return reverse(reverse(n.toString()).replace(rx, '$1' + sep));

}
于 2012-05-16T05:18:54.137 に答える
0

これを試してください:

result = subject.replace(/([0-9]+?)([0-9]{3})(?=.*?\.|$)/mg, "$1,$2");

ここでテスト

于 2012-05-16T05:28:45.373 に答える