Javascript: использование Regex для определения числового формата - PullRequest
0 голосов
/ 11 марта 2020

У меня есть такая строка:

Поздравляем {0}, который выиграл {1} {2: #, ## 0. ##} в {3}

И массив данных примерно так:

["Join", "USD", 10000, "Poker round 10"];

Я написал функция для форматирования этой строки, но моя проблема в том, что цифровой формат не может быть обнаружен.

String.prototype.format = function (arg) {
    var rep_fn = undefined;

    if (typeof arg == "object") {
        rep_fn = function (m, k) { return arg[k]; };
    }
    else {
        var args = arguments;
        rep_fn = function (m, k) { return args[parseInt(k)]; };
    }

    return this.replace(/\{(\w+)\}/g, rep_fn);
};


var fm = "Congratulation to {0} who won {1} {2:#,##0.##} in {3}";
var data = ["Join", "USD", 10000, "Poker round 10"];
console.log(fm.format(data));

Текущий результат:

Поздравляем присоединиться, кто выиграл USD {2: #, ## 0. ##} в раунде игры в покер 10

Ожидайте:

Поздравляем присоединиться, кто выиграл 10 000,00 долларов США в раунде игры в покер 10

У кого-нибудь есть идеальный способ помочь мне решить эту проблему? Большое спасибо.

1 Ответ

0 голосов
/ 11 марта 2020

У вас много избыточного кода. Вам не нужно var args = arguments. Ваш блок else никогда не выполняется, потому что if всегда имеет значение true.

String.prototype.format = function (arg) {
    for (let i = 0; i < arg.length; i++) {
        if (typeof arg[i] == "number") {
           arg[i] = arg[i].toString().replace(/(\d)(?=(\d{3})+(?!\d))/g, '$1,') + ".00";
        }
    }
   return this.replace(/\{(\w+)\}/g, (m,k) => arg[k]);
};


var fm = "Congratulation to {0} who won {1} {2} in {3}";
var data = ["Join", "USD", 10000, "Poker round 10"];
console.log(fm.format(data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...