等效于 jQuery 中的 String.format

IT技术 javascript jquery string.format
2021-01-17 09:24:36

我正在尝试将一些 JavaScript 代码从 MicrosoftAjax 移动到 JQuery。我在 MicrosoftAjax 中使用了流行的 .net 方法的 JavaScript 等效项,例如 String.format()、String.startsWith() 等。jQuery 中是否有等效项?

6个回答

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;
}

这是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);
}
哇,我实际上已经考虑过这个但也认为这是不可能的,因为许可证,不知道他们是在 Microsoft Permissive License 下发布的,非常感谢
2021-03-13 09:24:36
看起来好像没什么大不了的。显然,JavaScript 版本没有所有花哨的数字格式。blog.stevex.net/index.php/string-formatting-in-csharp
2021-03-16 09:24:36
许可证或没有许可证.. 只有一种正确的方法来编写如此简单的东西
2021-03-21 09:24:36
每次调用格式时为每个参数构造(然后丢弃)一个 RegEx 对象可能会使垃圾收集器负担过重。
2021-04-06 09:24:36
警告:这将递归格式化:因此,如果您有{0}{1},{0}将首先被替换,然后所有出现{1}在已替换文本和原始格式中的 都将被替换。
2021-04-07 09:24:36

这是 Josh 发布的函数的一个更快/更简单(和原型)的变体:

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) 

我经常使用它以将其别名为 just f,但您也可以使用更详细的format. 例如'Hello {0}!'.format(name)

对于现代浏览器,还有更简单的方法:stackoverflow.com/a/41052964/120296
2021-03-18 09:24:36
@david 模板字符串实际上根本不是一回事。它们是字符串连接的语法糖,这很好,但与格式化不同。它们立即运行,因此,替换必须在定义点的范围内。因此,您不能将它们存储在文本文件或数据库中。事实上,将它们存储在任何地方的唯一方法就是将它们放在一个函数中。格式化字符串函数采用不关心变量名称的位置替换。
2021-03-24 09:24:36

上述许多函数(除了 Julian 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

这是一个正确的函数。这是 Julian Jelfs 代码的原型变体,我把它弄得更紧了一点:

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

这是 Blair Mitchelmore 的另一个很好的实现,有很多不错的额外功能:https ://web.archive.org/web/20120315214858/http://blairmitchelmore.com/javascript/string.format

我上面提到的两个注释的格式实现已移至masterdata.se/r/string_format_for_javascript
2021-03-18 09:24:36
注意:ianj 在本页其他地方的回答使您可以使用命名参数而不是数字参数。如果将他的方法更改为使用原型的方法,则必须将 slice.call 函数的第二个参数从 1 更改为 0。
2021-03-20 09:24:36
哦,还有一个使用 Python 插值格式的:code.google.com/p/jquery-utils/wiki/...
2021-03-23 09:24:36
还有一个,我没有仔细研究过,但它似乎实现了 {0:+$#,0.00;-$#,0.00;0} 之类的格式masterdata.dyndns.org/r/string_format_for_javascript
2021-04-07 09:24:36

制作了一个将集合或数组作为参数的格式函数

用法:

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];
    });
};
我不想扩展字符串
2021-03-18 09:24:36
不错,唯一缺少的是: String.prototype.format = function (col) {return format(this,col);}
2021-03-29 09:24:36
用法中有一个小错字:第二行应该是: format("i can speak {0} since i was {1}",'javascript',10);
2021-04-03 09:24:36
为什么不更喜欢使用扩展字符串String.prototype
2021-04-11 09:24:36

有一个(有点)官方选项:jQuery.validator.format

附带 jQuery 验证插件 1.6(至少)。
String.Format.NET 中的非常相似

编辑固定断开的链接。