Эквивалент строки.формат в jQuery
Я пытаюсь переместить некоторый код JavaScript из MicrosoftAjax в JQuery. Я использую эквиваленты JavaScript в MicrosoftAjax популярных методов .net, например String.строка формата.startsWith (), etc. Есть ли эквиваленты им в jQuery?
20 ответов:
The исходный код для ASP.NET AJAX доступен для справки, так что вы можете выбрать через него и включить части, которые вы хотите продолжать использовать в отдельный файл JS. Или вы можете перенести их в jQuery.
здесь функция format...
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; }
а вот функции endsWith и startsWith прототипа...
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); }
Это более быстрая / простая (и прототипическая) вариация функции, которую опубликовал Джош:
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)
многие из перечисленных выше функций (за исключением Юлиана Jelfs) и содержать следующее сообщение об ошибке:
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
сделал функцию форматирования, которая принимает либо коллекцию, либо массив в качестве аргументов
использование:
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]; }); };
есть (несколько) официальный вариант:jQuery.валидатор.формат.
поставляется с плагином проверки jQuery 1.6 (по крайней мере).
Очень похоже наString.Format
найдено в. NET.Edit исправлена битая ссылка.
Если вы используете плагин проверки вы можете использовать:
jQuery.validator.format("{0} {1}", "cool", "formatting") = 'cool formatting'
http://docs.jquery.com/Plugins/Validation/jQuery.validator.format#templateargumentargumentN...
хотя не совсем то, что просил 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' }));
ни один из ответов, представленных до сих пор, не имеет очевидной оптимизации использования приложения для инициализации один раз и хранения регулярных выражений для последующего использования.
// 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() { var idx = 1 * .match(rx2)[0]; return args[idx] !== undefined ? args[idx] : (args[idx] === "" ? "" : ); }); } }()); alert("{0},{0},{{0}}!".format("{X}"));
кроме того, ни один из примеров не уважает реализацию format (), если она уже существует.
вот мой:
String.format = function(tokenised){ var args = arguments; return tokenised.replace(/{[0-9]}/g, function(matched){ matched = matched.replace(/[{}]/g, ""); return args[parseInt(matched)+1]; }); }
не пуленепробиваемый, но работает, если вы используете его разумно.
используя современный браузер, который поддерживает EcmaScript 2015 (ES6), вы можете наслаждаться Шаблон Строки. Вместо форматирования вы можете напрямую ввести в него значение переменной:
var name = "Waleed"; var message = `Hello ${name}!`;
Примечание строка шаблона должна быть записана с помощью обратных тиков (`).
вот моя версия, которая способна избежать ' {'и очистить эти неназначенные держатели мест.
function getStringFormatPlaceHolderRegEx(placeHolderIndex) { return new RegExp('({)?\{' + placeHolderIndex + '\}(?!})', 'gm') } function cleanStringFormatResult(txt) { if (txt == null) return ""; return txt.replace(getStringFormatPlaceHolderRegEx("\d+"), ""); } String.prototype.format = function () { var txt = this.toString(); for (var i = 0; i < arguments.length; i++) { var exp = getStringFormatPlaceHolderRegEx(i); txt = txt.replace(exp, (arguments[i] == null ? "" : arguments[i])); } return cleanStringFormatResult(txt); } String.format = function () { var s = arguments[0]; if (s == null) return ""; for (var i = 0; i < arguments.length - 1; i++) { var reg = getStringFormatPlaceHolderRegEx(i); s = s.replace(reg, (arguments[i + 1] == null ? "" : arguments[i + 1])); } return cleanStringFormatResult(s); }
следующий ответ, вероятно, является наиболее эффективным, но имеет оговорку, что он подходит только для 1 к 1 отображений аргументов. Это использует самый быстрый способ объединения строк (подобно stringbuilder: массив строк, Соединенных). Это мой собственный код. Вероятно, нужен лучший разделитель, хотя.
String.format = function(str, args) { var t = str.split('~'); var sb = [t[0]]; for(var i = 0; i < args.length; i++){ sb.push(args[i]); sb.push(t[i+1]); } return sb.join(""); }
использовать его как:
alert(String.format("<a href='~'>~</a>", ["one", "two"]));
теперь вы можете использовать Шаблон Литералы:
var w = "the Word"; var num1 = 2; var num2 = 3; var long_multiline_string = `This is very long multiline templete string. Putting somthing here: ${w} I can even use expresion interpolation: Two add three = ${num1 + num2} or use Tagged template literals You need to enclose string with the back-tick (\` \`)`; console.log(long_multiline_string);
это нарушает сухой принцип, но это краткое решение:
var button = '<a href="{link}" class="btn">{text}</a>'; button = button.replace('{text}','Authorize on GitHub').replace('{link}', authorizeUrl);
путь мимо конца сезона, но я только что смотрел на ответы, данные и есть мой tuppence стоит:
использование:
var one = strFormat('"{0}" is not {1}', 'aalert', 'defined'); var two = strFormat('{0} {0} {1} {2}', 3.14, 'a{2}bc', 'foo');
способ:
function strFormat() { var args = Array.prototype.slice.call(arguments, 1); return arguments[0].replace(/\{(\d+)\}/g, function (match, index) { return args[index]; }); }
результат:
"aalert" is not defined 3.14 3.14 a{2}bc foo
<html> <body> <script type="text/javascript"> var str="http://xyz.html?ID={0}&TId={1}&STId={2}&RId={3},14,480,3,38"; document.write(FormatString(str)); function FormatString(str) { var args = str.split(','); for (var i = 0; i < args.length; i++) { var reg = new RegExp("\{" + i + "\}", ""); args[0]=args[0].replace(reg, args [i+1]); } return args[0]; } </script> </body> </html>
Я не мог получить ответ Джоша Стодолы на работу, но следующее сработало для меня. Обратите внимание на спецификацию
prototype
. (Протестировано на IE, FF, Chrome и Safari.):String.prototype.format = function() { var s = this; if(t.length - 1 != args.length){ alert("String.format(): Incorrect number of arguments"); } for (var i = 0; i < arguments.length; i++) { var reg = new RegExp("\{" + i + "\}", "gm"); s = s.replace(reg, arguments[i]); } return s; }
s
действительно должно быть клон наthis
чтобы не быть разрушительным методом, но это действительно не обязательно.
расширение на большой ответ адамджлева выше, вот версия TypeScript:
// Extending String prototype interface String { format(...params: any[]): string; } // Variable number of params, mimicking C# params keyword // params type is set to any so consumer can pass number // or string, might be a better way to constraint types to // string and number only using generic? String.prototype.format = function (...params: any[]) { var s = this, i = params.length; while (i--) { s = s.replace(new RegExp('\{' + i + '\}', 'gm'), params[i]); } return s; };
у меня есть планкер, который добавляет его к прототипу строки: строку.формат Это не так коротко, как некоторые другие примеры, но гораздо более гибко.
использование похоже на версию c#:
var str2 = "Meet you on {0}, ask for {1}"; var result2 = str2.format("Friday", "Suzy"); //result: Meet you on Friday, ask for Suzy //NB: also accepts an array
кроме того, добавлена поддержка использования имен и свойств объектов
var str1 = "Meet you on {day}, ask for {Person}"; var result1 = str1.format({day: "Thursday", person: "Frank"}); //result: Meet you on Thursday, ask for Frank
вы также можете закрыть массив с заменами, как это.
var url = '/getElement/_/_/_'.replace(/_/g, (_ => this.ar[this.i++]).bind({ar: ["invoice", "id", 1337],i: 0})) > '/getElement/invoice/id/1337
или можно попробовать
bind
'/getElement/_/_/_'.replace(/_/g, (function(_) {return this.ar[this.i++];}).bind({ar: ["invoice", "id", 1337],i: 0}))