相当于printf / string.format的JavaScript

我正在寻找C / PHP printf()或C#/ Java程序员的String.Format() (用于.NET的IFormatProvider )的JavaScript等价物。

我现在的基本要求是数字分隔格式,但处理大量组合(包括日期)的东西会很好。

我意识到微软的Ajax库提供了一个String.Format()版本,但我们不希望这个框架的整个开销。


试用JavaScript的sprintf()。


更新好吧,如果你真的想自己做一个简单的格式化方法,不要连续进行替换,而是同时进行替换。

由于大多数提及的其他提议都失败,因为以前替换的替换字符串也包含如下所示的格式序列:

"{0}{1}".format("{1}", "{0}")

通常情况下,您会希望输出为{1}{0}但实际输出为{1}{1} 。 所以做一个同时更换,而不是像在恐惧噬菌的建议。


建立在以前建议的解决方案上:

// 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")

输出

ASP已死,但ASP.NET还活着! ASP {2}


如果你不想修改String的原型:

if (!String.format) {
  String.format = function(format) {
    var args = Array.prototype.slice.call(arguments, 1);
    return format.replace(/{(d+)}/g, function(match, number) { 
      return typeof args[number] != 'undefined'
        ? args[number] 
        : match
      ;
    });
  };
}

给你更熟悉的:

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

结果相同:

ASP已死,但ASP.NET还活着! ASP {2}


这很有趣,因为堆栈溢出实际上对于名为formatUnicornString原型具有自己的格式化函数。 尝试一下! 进入控制台并输入如下所示的内容:

"Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"});

萤火

你得到这个输出:

Hello, Gabriel, are you feeling OK?

您可以使用对象,数组和字符串作为参数! 我得到了它的代码,并重新编写了一个新的String.prototype.format版本:

String.prototype.formatUnicorn = String.prototype.formatUnicorn ||
function () {
    "use strict";
    var str = this.toString();
    if (arguments.length) {
        var t = typeof arguments[0];
        var key;
        var args = ("string" === t || "number" === t) ?
            Array.prototype.slice.call(arguments)
            : arguments[0];

        for (key in args) {
            str = str.replace(new RegExp("{" + key + "}", "gi"), args[key]);
        }
    }

    return str;
};

请注意聪明的Array.prototype.slice.call(arguments)调用 - 这意味着如果抛出的是字符串或数字的参数,而不是单个JSON样式的对象,那么您几乎可以得到C#的String.Format行为。

"a{0}bcd{1}ef".formatUnicorn("foo", "bar"); // yields "aFOObcdBARef"

这是因为Arrayslice会将arguments中的所有arguments强制到Array ,无论它是否是原来的,并且key将是每个数组元素的索引(0,1,2 ...)强制为一个字符串(例如, “0”,所以"{0}"为您的第一个正则表达式模式)。

整齐。

链接地址: http://www.djcxy.com/p/3917.html

上一篇: JavaScript equivalent to printf/string.format

下一篇: Functional programming vs Object Oriented programming