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.

1618voto

Gumbo Punkte 617646

Aktuelles JavaScript

Ab ES6 können Sie Template-Strings verwenden:

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

Siehe Kim's réponse unten für Details.


Ältere Antwort

Versuchen Sie sprintf() für JavaScript .


Wenn Sie wirklich eine einfache Formatmethode selbst durchführen wollen, sollten Sie die Ersetzungen nicht nacheinander, sondern gleichzeitig vornehmen.

Denn die meisten anderen Vorschläge, die erwähnt wurden, schlagen fehl, wenn eine Ersetzungszeichenfolge der vorherigen Ersetzung auch eine solche Formatsequenz enthält:

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

Normalerweise würden Sie erwarten, dass die Ausgabe lautet {1}{0} aber die tatsächliche Ausgabe ist {1}{1} . Führen Sie stattdessen eine gleichzeitige Ersetzung wie in fearphage's Vorschlag .

1501voto

fearphage Punkte 16530

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 es vorziehen, nicht zu ändern String Der 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 Ihnen das viel vertrauter:

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

mit demselben Ergebnis:

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

646voto

Gabriel Nahmias Punkte 820

Es ist lustig, denn Stack Overflow hat tatsächlich eine eigene Formatierungsfunktion für die String Prototyp genannt formatUnicorn . Versuchen Sie es! Gehen Sie in die Konsole und geben Sie etwas ein 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 erhalten und ihn ü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;
};

Beachten Sie die clevere Array.prototype.slice.call(arguments) Aufruf - das heißt, wenn Sie Argumente einwerfen, die Strings oder Zahlen sind, und nicht ein einzelnes Objekt im JSON-Stil, erhalten Sie C#s String.Format Verhalten fast genau.

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

Das liegt daran, dass Array 's slice zwingt alles, was in arguments in eine Array unabhängig davon, ob es ursprünglich war oder nicht, und die key ist der Index (0, 1, 2...) jedes Array-Elements, der in eine Zeichenkette umgewandelt wird (z.B. "0", also "\\{0\\}" für Ihr erstes Regexp-Muster).

Nett.

358voto

rescdsk Punkte 8548

Zahlenformatierung in JavaScript

Ich bin auf diese Frageseite gekommen in der Hoffnung, zu erfahren, wie man Formatnummern in JavaScript, ohne eine weitere Bibliothek einführen zu müssen. Hier ist, was ich gefunden habe:

Rundung von Fließkommazahlen

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

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

Exponentialform

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

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

Hexadezimal und andere Basen

Um Zahlen in der Basis B zu drucken, versuchen Sie num.toString(B) . JavaScript unterstützt die automatische Konvertierung in und aus den Basen 2 bis 36 (einige Browser verfügen außerdem über eingeschränkte Unterstützung für base64-Kodierung ).

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

Referenzseiten

Kurzes Tutorial zur Formatierung von JS-Zahlen

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

313voto

Kim Punkte 1241

Ab ES6 können Sie Folgendes verwenden Vorlagezeichenfolgen :

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

Beachten Sie, dass Template-Strings umgeben von Backticks ` anstelle von (einfachen) 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

Anmerkung: Auf der Mozilla-Website finden Sie eine Liste der unterstützten Browser.

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