在JavaScript中是否有类似C# String.Format()的方法?

85

C#拥有非常强大的String.Format()方法,可以使用参数替换元素,如{0}。JavaScript有相应的方法吗?


3
没有内置的等效物,但您可以搜索外部库。 - kirilloid
2
另一个选择是CoffeeScript,它具有Ruby风格的字符串插值。 - Matt Greer
4
那个重复链接是错误的。这是一个关于在JavaScript中使用string.format的问题,而那个链接是关于jQuery的。JavaScript !== jQuery。甚至没有jQuery标签。你可以认为这个问题(“JavaScript equivalent to printf/string.format”)是正确的“原始问题”,但当前链接的不是。 - ruffin
'{name} is {mood}'.replace('{name}', 'Tobi').replace('{mood}', 'happy') - ilyaigpetrov
2
我们正在寻找一个__非jQuery__的答案。你如何将jQuery帖子标记为此问题的重复?那些投票关闭这个问题的用户在这方面极其无知。顺便说一下,我投票重新开放。 - code4life
显示剩余2条评论
4个回答

92
尝试使用 JavaScript 的 sprintf() 函数,可以访问此链接
或者,
// First, checks if it isn't implemented yet.
if (!String.prototype.format) {
  String.prototype.format = function() {
    var args = arguments;
    return this.replace(/{(\d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number]
        : match
      ;
    });
  };
}

"{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")

以下两个答案来自于JavaScript中的printf/string.format的等效方法


一种基于实际 .net 代码的参数格式化解决方案:https://dev59.com/r3E85IYBdhLWcg3w8IXK - JasonS
如果您不想扩展原型:export class String { //String.format("{0} comes before {1}", "a", "b") static format(stringToFormat, ...tokens) { return stringToFormat.replace(/{(\d+)}/g, function (match, number) { return typeof tokens[number] != 'undefined' ? tokens[number] : match; }); }; } - miraco
1
是的,我认为扩展标准对象的原型是一种不好的做法。 - wm1sr
基本上逻辑是: 将字符串格式化为stringToFormat,使用正则表达式替换模式/{(\d+)}/g,并通过匿名函数进行替换操作。函数中的参数match表示匹配到的字符串,number表示匹配到的数字。如果tokens[number]存在,则返回对应的值;否则返回原字符串。可以将此代码放入一个普通方法中,如下所示:function format(stringToFormat, ...tokens) { return stringToFormat.replace(/{(\d+)}/g, function (match, number) { return typeof tokens[number] != 'undefined' ? tokens[number] : match; }); }; - Vinod Poorma

32

我正在使用:

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

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

用法: "Hello {0}".format("World");

我在这里找到它。

已更新:

在ES6/ES2015中,你可以使用模板字符串, 例如:

'use strict';

let firstName = 'John',
    lastName = 'Smith';

console.log(`Full Name is ${firstName} ${lastName}`); 
// or
console.log(`Full Name is ${firstName + ' ' + lastName}');

5
尽管字符串模板是一个不错的功能,但它并不相同。您无法将字符串存储在内存中或其他地方(例如注册表),并在运行时稍后使用任何输入来使用它。 - Mike Haas

17

根据 @Vlad Bezden 的回答,我使用了稍作修改的代码,因为我更喜欢使用命名占位符:

String.prototype.format = function(placeholders) {
    var s = this;
    for(var propertyName in placeholders) {
        var re = new RegExp('{' + propertyName + '}', 'gm');
        s = s.replace(re, placeholders[propertyName]);
    }    
    return s;
};

用法:

"{greeting} {who}!".format({greeting: "Hello", who: "world"})

String.prototype.format = function(placeholders) {
    var s = this;
    for(var propertyName in placeholders) {
        var re = new RegExp('{' + propertyName + '}', 'gm');
        s = s.replace(re, placeholders[propertyName]);
    }    
    return s;
};

$("#result").text("{greeting} {who}!".format({greeting: "Hello", who: "world"}));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>


非常好,当有多个变量传递时更适合进行格式化。 - Ctrl-C

15

我很久以前创建了它,相关问题

String.Format = function (b) {
    var a = arguments;
    return b.replace(/(\{\{\d\}\}|\{\d\})/g, function (b) {
        if (b.substring(0, 2) == "{{") return b;
        var c = parseInt(b.match(/\d/)[0]);
        return a[c + 1]
    })
};

这似乎是一个更好的答案,因为它没有干扰“原型”。 - Luke
2
很好,示例用法:String.Format("你好 {0}。生命的意义是 {1}!", '世界',42); - joedotnot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接