36099
javascriptでの質問です。  
入力された値によりカンマ区切りの位置を変動させたいのですが、カンマが反映されません。  
正規表現を使用して以下のように現在やっているのですが、  
どうすればカンマをユーザー指定でつけられるようになりますでしょうか。  
以下ソースコードです。

kanがユーザーが指定するカンマ区切りの数値を取得した変数です。  
inpが数値が入力されたものを取得した変数です。  
disが値を表示する変数です。

例：ユーザー→３を入力  
数値：123,456,789  
ユーザー→２を入力  
数値：1,23,45,67,89

```

    rep = new RegExp(kan);
    inp = inp.toString().replace(/(\d)(?=(\d{rep})+$)/g , '$1,');
    dis.value = inp;
    
```

上記のように正規表現の中に変数を代入していますが、  
これが動きません。  
RegExpの使い方自体が間違っているのでしょうか。

※上記の変数[rep]を入れている箇所に数値を自分で入力すると、  
正常に入力した値通りカンマがつけられます。

教えていただけないでしょうか。  
宜しくお願い致します。
CC BY-SA 3.0
2017-07-04T16:25:17.873
36098
2017-07-04T21:41:18.890
2017-07-04T21:41:18.890
13251
13251
question
javascript
カンマ区切りをユーザーの入力通りに入れ込む方法が分かりません。
[正規表現リテラル](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Guide/Regular_Expressions)に変数を展開する機能はありません。動的に正規表現を生成する場合、[`RegExp`コンストラクタ](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/RegExp)を用いた方法が一般的です。

> RegExp コンストラクタは、パターンに従ったテキストにマッチする正規表現オブジェクトを生成します。
>
> ### 構文
>
> リテラル記法およびコンストラクタ記法を使用できます:
```

>     /pattern/flags
>     new RegExp(pattern[, flags])
>  
```

```

    const rep = 3; // for example
    const patternString = `(\\d)(?=(\\d{${rep}})+$)`;
    
    // この例では、リテラルでいう /(\d)(?=(\d{3})+$)/gに
    // 相当するRegExpオブジェクトを生成します
    const regex = new RegExp(patternString, 'g');
    
    const result = '123456789'.replace(regex, '$1,');
    console.assert(result === '123,456,789');
    
```

[テンプレートリテラル](https://developer.mozilla.org/en-
US/docs/Web/JavaScript/Reference/Template_literals)をご存じでなければ、`patternString`の行はつぎに等価です。

```

    const patternString = '(\\d)(?=(\\d{' + rep + '})+$)';
    
```

* * *

参考までに、質問の箇所はともかく、話題としてはさんざん掘りつくされたネタ（例：[How to print a number with commas as
thousands separators in
JavaScript](https://stackoverflow.com/questions/2901102/how-to-print-a-number-
with-commas-as-thousands-separators-in-
javascript)）ですので、検索してみるといろいろなアプローチが見つかるとおもいます。
CC BY-SA 3.0
2017-07-04T17:05:37.843
36099
2017-07-04T17:23:29.067
2017-07-04T17:23:29.067
36098
answer