2415 Stimmen

JavaScript-Äquivalent zu printf/String.Format

Ich bin auf der Suche nach einem guten JavaScript-Äquivalent der C/PHP printf() oder für C#/Java-Programmierer, String.Format() ( IFormatProvider für .NET).

Meine Grundanforderung ist ein Tausendertrennzeichenformat für Zahlen für jetzt, aber etwas, das viele Kombinationen (einschließlich Daten) verarbeitet, wäre gut.

Ich weiß, dass Microsofts Ajax Bibliothek bietet eine Version von String.Format() aber wir wollen nicht den gesamten Overhead dieses Rahmens haben.

182voto

Filipiz Punkte 1031

Jsxt, Zippo

Diese Option passt besser.

String.prototype.format = function() {
    var formatted = this;
    for (var i = 0; i < arguments.length; i++) {
        var regexp = new RegExp('\\{'+i+'\\}', 'gi');
        formatted = formatted.replace(regexp, arguments[i]);
    }
    return formatted;
};

Mit dieser Option kann ich Zeichenketten wie diese ersetzen:

'The {0} is dead. Don\'t code {0}. Code {1} that is open source!'.format('ASP', 'PHP');

Mit deinem Code würde die zweite {0} nicht ersetzt werden ;)

123voto

George Eracleous Punkte 4089

Für Node.js Benutzer gibt es util.format die eine printf-ähnliche Funktionalität hat:

util.format("%s world", "Hello")

120voto

Zippo Punkte 14520

Ich verwende diese einfache Funktion:

String.prototype.format = function() {
    var formatted = this;
    for( var arg in arguments ) {
        formatted = formatted.replace("{" + arg + "}", arguments[arg]);
    }
    return formatted;
};

Das ist sehr ähnlich zu string.format:

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

68voto

Monarch Wadia Punkte 3652

Ich bin überrascht, dass niemand die reduce handelt es sich um eine native, prägnante und leistungsstarke JavaScript-Funktion.

ES6 (EcmaScript2015)

String.prototype.format = function() {
  return [...arguments].reduce((p,c) => p.replace(/%s/,c), this);
};

console.log('Is that a %s or a %s?... No, it\'s %s!'.format('plane', 'bird', 'SOman'));

< ES6

function interpolate(theString, argumentArray) {
    var regex = /%s/;
    var _r=function(p,c){return p.replace(regex,c);}
    return argumentArray.reduce(_r, theString);
}

interpolate("%s, %s and %s", ["Me", "myself", "I"]); // "Me, myself and I"

Wie es funktioniert:

reduzieren. wendet eine Funktion auf einen Akkumulator und jedes Element im Array (von links nach rechts) an, um es auf einen einzigen Wert zu reduzieren.

var _r= function(p,c){return p.replace(/%s/,c)};

console.log(
  ["a", "b", "c"].reduce(_r, "[%s], [%s] and [%s]") + '\n',
  [1, 2, 3].reduce(_r, "%s+%s=%s") + '\n',
  ["cool", 1337, "stuff"].reduce(_r, "%s %s %s")
);

54voto

bart Punkte 7384

Hier ist ein minimal Implementierung von sprintf in JavaScript: Sie kann nur "%s" und "%d", aber ich habe Platz für eine Erweiterung gelassen. Es ist nutzlos für den OP, aber andere Leute, die über diesen Thread stolpern, der von Google kommt, könnten davon profitieren.

function sprintf() {
    var args = arguments,
    string = args[0],
    i = 1;
    return string.replace(/%((%)|s|d)/g, function (m) {
        // m is the matched format, e.g. %s, %d
        var val = null;
        if (m[2]) {
            val = m[2];
        } else {
            val = args[i];
            // A switch statement so that the formatter can be extended. Default is %s
            switch (m) {
                case '%d':
                    val = parseFloat(val);
                    if (isNaN(val)) {
                        val = 0;
                    }
                    break;
            }
            i++;
        }
        return val;
    });
}

Ejemplo:

alert(sprintf('Latitude: %s, Longitude: %s, Count: %d', 41.847, -87.661, 'two'));
// Expected output: Latitude: 41.847, Longitude: -87.661, Count: 0

Im Gegensatz zu ähnlichen Lösungen in früheren Antworten werden hier alle Ersetzungen vorgenommen in einem Rutsch Es werden also keine Teile von bereits ersetzten Werten ersetzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X