Frage JavaScript entspricht printf / String.Format


Ich suche ein gutes JavaScript-Äquivalent des C / PHP printf() oder für C # / Java-Programmierer, String.Format() (IFormatProvider für .NET).

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

Ich realisiere Microsofts Ajax Bibliothek bietet eine Version von String.Format(), aber wir wollen nicht den gesamten Overhead dieses Frameworks.


1605
2018-01-12 20:02


Ursprung


Antworten:


Versuchen sprintf () für JavaScript.


AktualisierenOk, wenn Sie wirklich eine einfache Formatierungsmethode selbst machen wollen, machen Sie die Ersetzungen nicht nacheinander, sondern tun Sie sie gleichzeitig.

Da die meisten anderen Vorschläge, die erwähnt werden, fehlschlagen, wenn eine Ersetzungszeichenfolge der vorherigen Ersetzung auch eine Formatsequenz wie folgt enthält:

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

Normalerweise würden Sie die Ausgabe erwarten {1}{0} aber die tatsächliche Ausgabe ist {1}{1}. Also einen simultanen Ersatz statt wie in featherphages Vorschlag.


684



Aufbauend auf den zuvor vorgeschlagenen Lösungen:

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

Ausgänge

ASP ist tot, aber ASP.NET lebt! ASP {2}


Wenn Sie nicht ändern möchten StringDer Prototyp:

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

Gibt dir das viel vertrautere:

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

mit dem gleichen Ergebnis:

ASP ist tot, aber ASP.NET lebt! ASP {2}


1278



Es ist lustig, weil Stack Overflow tatsächlich eine eigene Formatierungsfunktion für die String Prototyp genannt formatUnicorn. Versuch es! Geh in die Konsole und tippe etwas wie:

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

Firebug

Sie erhalten diese Ausgabe:

Hello, Gabriel, are you feeling OK?

Sie können Objekte, Arrays und Strings als Argumente verwenden! Ich habe seinen Code und überarbeitet, um eine neue Version von 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;
};

Beachte das Kluge Array.prototype.slice.call(arguments) call - das heißt, wenn Sie Argumente, die Strings oder Zahlen sind, nicht ein einzelnes JSON-style Objekt, werfen Sie C # 's String.Format Verhalten fast genau.

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

Das ist, weil Arrayist es slice wird erzwingen, was auch immer drin ist arguments In ein Arrayob es ursprünglich oder nicht war, und die key wird der Index (0, 1, 2, ...) jedes Array-Elements in eine Zeichenfolge (z. B. "0") umgewandelt "\\{0\\}" für dein erstes Regexp-Muster).

Ordentlich.


366



Zahlenformatierung in JavaScript

Ich bin auf diese Fragenseite gekommen, in der Hoffnung, das zu finden Formatnummern in JavaScript, ohne eine weitere Bibliothek einzuführen. Folgendes habe ich gefunden:

Runden von Gleitkommazahlen

Das Äquivalent von sprintf("%.2f", num) in JavaScript scheint zu sein num.toFixed(2), welche Formate num auf 2 Dezimalstellen, mit Rundung (aber siehe @ ars265 Kommentar zu Math.round unten).

(12.345).toFixed(2); // returns "12.35" (rounding!)
(12.3).toFixed(2); // returns "12.30" (zero padding)

Exponentielle Form

Das Äquivalent von sprintf("%.2e", num) ist num.toExponential(2).

(33333).toExponential(2); // "3.33e+4"

Hexadezimale und andere Basen

Um Zahlen in Base B zu drucken, versuchen Sie es num.toString(B). JavaScript unterstützt die automatische Konvertierung von und zu den Basen 2 bis 36 (zusätzlich haben einige Browser begrenzte Unterstützung für Base64-Codierung).

(3735928559).toString(16); // to base 16: "deadbeef"
parseInt("deadbeef", 16); // from base 16: 3735928559

Referenzseiten

Kurzes Tutorial zur Formatierung von JS-Nummern

Mozilla Referenzseite für toFixed () (mit Links zu toPrecision (), toExponential (), toLocaleString (), ...)


288



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 Strings wie diese ersetzen:

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

Mit Ihrem Code wird die zweite {0} nicht ersetzt. ;)


168



Ab ES6 könntest du verwenden Vorlage Zeichenfolgen:

let soMany = 10;
console.log(`This is ${soMany} times easier!`);
// "This is 10 times easier!

Beachten Sie, dass Template-Strings sind umgeben von Backticks `anstelle von (einzelnen) Anführungszeichen.

Für weitere Informationen:

https://developers.google.com/web/updates/2015/01/ES6-Template-Strings

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings

Hinweis: Auf der Mozilla-Seite finden Sie eine Liste der unterstützten Browser.


168



Ich benutze 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")

90



Hier ist ein minimal Implementierung von sprintf in JavaScript: Es tut nur "% s" und "% d", aber ich habe Platz für die Erweiterung gelassen. Es ist nutzlos für das OP, aber andere Leute, die über diesen Thread von Google stolpern, 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;
    });
}

Beispiel:

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 macht dies alle Substitutionen auf einmalDaher werden Teile von zuvor ersetzten Werten nicht ersetzt.


48