Эквивалент String.format в jQuery - PullRequest
189 голосов
/ 24 июня 2009

Я пытаюсь переместить некоторый код JavaScript из MicrosoftAjax в JQuery. Я использую эквиваленты JavaScript в MicrosoftAjax популярных методов .net, например String.format (), String.startsWith () и т. Д. Есть ли для них эквиваленты в jQuery?

Ответы [ 20 ]

192 голосов
/ 24 июня 2009

Исходный код для ASP.NET AJAX доступен для справки , так что вы можете выбрать его и включить детали, которые хотите продолжить использовать, в отдельный файл JS. Или вы можете перенести их на jQuery.

Вот функция форматирования ...

String.format = function() {
  var s = arguments[0];
  for (var i = 0; i < arguments.length - 1; i++) {       
    var reg = new RegExp("\\{" + i + "\\}", "gm");             
    s = s.replace(reg, arguments[i + 1]);
  }

  return s;
}

А вот и конец, и начинается с функций-прототипов ...

String.prototype.endsWith = function (suffix) {
  return (this.substr(this.length - suffix.length) === suffix);
}

String.prototype.startsWith = function(prefix) {
  return (this.substr(0, prefix.length) === prefix);
}
145 голосов
/ 15 апреля 2010

Это более быстрый / простой (и прототипный) вариант функции, который опубликовал Джош:

String.prototype.format = String.prototype.f = function() {
    var s = this,
        i = arguments.length;

    while (i--) {
        s = s.replace(new RegExp('\\{' + i + '\\}', 'gm'), arguments[i]);
    }
    return s;
};

Использование:

'Added {0} by {1} to your collection'.f(title, artist)
'Your balance is {0} USD'.f(77.7) 

Я использую это настолько, что я присвоил ему псевдоним f, но вы также можете использовать более подробный format. например 'Hello {0}!'.format(name)

131 голосов
/ 22 февраля 2011

Многие из вышеперечисленных функций (кроме функций Джулиана Джелфса) содержат следующую ошибку:

js> '{0} {0} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 3.14 afoobc foo

Или для вариантов, которые отсчитываются в обратном направлении от конца списка аргументов:

js> '{0} {0} {1} {2}'.format(3.14, 'a{0}bc', 'foo');
3.14 3.14 a3.14bc foo

Вот правильная функция. Это прототипный вариант кода Джулиана Джелфса, который я немного сжал:

String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{(\d+)\}/g, function (m, n) { return args[n]; });
};

А вот немного более продвинутая версия, которая позволяет вам избегать скобок, удваивая их:

String.prototype.format = function () {
  var args = arguments;
  return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
    if (m == "{{") { return "{"; }
    if (m == "}}") { return "}"; }
    return args[n];
  });
};

Это работает правильно:

js> '{0} {{0}} {{{0}}} {1} {2}'.format(3.14, 'a{2}bc', 'foo');
3.14 {0} {3.14} a{2}bc foo

Вот еще одна хорошая реализация Блэра Митчелмора с кучей приятных дополнительных функций: https://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format

48 голосов
/ 17 марта 2011

Сделана функция форматирования, которая принимает коллекцию или массив в качестве аргументов

Использование:

format("i can speak {language} since i was {age}",{language:'javascript',age:10});

format("i can speak {0} since i was {1}",'javascript',10});

Код:

var format = function (str, col) {
    col = typeof col === 'object' ? col : Array.prototype.slice.call(arguments, 1);

    return str.replace(/\{\{|\}\}|\{(\w+)\}/g, function (m, n) {
        if (m == "{{") { return "{"; }
        if (m == "}}") { return "}"; }
        return col[n];
    });
};
36 голосов
/ 09 февраля 2010

Существует (несколько) официальный вариант: jQuery.validator.format .

Поставляется с плагином jQuery Validation 1.6 (как минимум).
Совершенно похоже на String.Format, найденное в .NET.

Редактировать Исправлена ​​неработающая ссылка.

17 голосов
/ 19 августа 2011

Если вы используете плагин проверки, вы можете использовать:

jQuery.validator.format("{0} {1}", "cool", "formatting") = 'cool formatting'

http://docs.jquery.com/Plugins/Validation/jQuery.validator.format#templateargumentargumentN...

12 голосов
/ 21 июня 2011

Хотя не совсем то, о чем спрашивал Q, я построил тот, который похож, но использует именованные заполнители вместо нумерованных. Я лично предпочитаю называть аргументы и просто отправлять объект в качестве аргумента (более подробный, но более простой в обслуживании).

String.prototype.format = function (args) {
    var newStr = this;
    for (var key in args) {
        newStr = newStr.replace('{' + key + '}', args[key]);
    }
    return newStr;
}

Вот пример использования ...

alert("Hello {name}".format({ name: 'World' }));
6 голосов
/ 09 декабря 2016

Используя современный браузер, который поддерживает EcmaScript 2015 (ES6), вы можете наслаждаться Строка шаблона . Вместо форматирования вы можете напрямую вставить в него значение переменной:

var name = "Waleed";
var message = `Hello ${name}!`;

Обратите внимание, что строка шаблона должна быть написана с помощью обратных тиков (`).

6 голосов
/ 07 августа 2011

Ни один из представленных ответов пока не имеет очевидной оптимизации использования приложения для однократной инициализации и сохранения регулярных выражений для последующего использования.

// DBJ.ORG string.format function
// usage:   "{0} means 'zero'".format("nula") 
// returns: "nula means 'zero'"
// place holders must be in a range 0-99.
// if no argument given for the placeholder, 
// no replacement will be done, so
// "oops {99}".format("!")
// returns the input
// same placeholders will be all replaced 
// with the same argument :
// "oops {0}{0}".format("!","?")
// returns "oops !!"
//
if ("function" != typeof "".format) 
// add format() if one does not exist already
  String.prototype.format = (function() {
    var rx1 = /\{(\d|\d\d)\}/g, rx2 = /\d+/ ;
    return function() {
        var args = arguments;
        return this.replace(rx1, function($0) {
            var idx = 1 * $0.match(rx2)[0];
            return args[idx] !== undefined ? args[idx] : (args[idx] === "" ? "" : $0);
        });
    }
}());

alert("{0},{0},{{0}}!".format("{X}"));

Кроме того, ни один из примеров не учитывает реализацию формата (), если он уже существует.

4 голосов
/ 04 февраля 2011

Вот мой:

String.format = function(tokenised){
        var args = arguments;
        return tokenised.replace(/{[0-9]}/g, function(matched){
            matched = matched.replace(/[{}]/g, "");
            return args[parseInt(matched)+1];             
        });
    }

Не пуленепробиваемый, но работает, если вы используете его разумно.

...