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.

15voto

Ich verwende eine kleine Bibliothek namens String.format für JavaScript das die meisten Formatstring-Funktionen unterstützt (einschließlich Zahlen- und Datumsformatierung) und die .NET-Syntax verwendet. Das Skript selbst ist kleiner als 4 kB, so dass es keinen großen Overhead verursacht.

14voto

Chris S Punkte 63542

Ich werde meine eigenen Entdeckungen hinzufügen, die ich gemacht habe, seit ich gefragt habe:

Leider scheint es, dass sprintf die Formatierung von Tausendertrennzeichen nicht wie das String-Format von .NET handhabt.

13voto

lior hakim Punkte 114

Sehr elegant:

String.prototype.format = function (){
    var args = arguments;
    return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (curlyBrack, index) {
        return ((curlyBrack == "{{") ? "{" : ((curlyBrack == "}}") ? "}" : args[index]));
    });
};

// Usage:
"{0}{1}".format("{1}", "{0}")

Die Anerkennung geht an (defekter Link) https://gist.github.com/0i0/1519811

13voto

17 of 26 Punkte 26635

Wenn Sie das Tausendertrennzeichen behandeln wollen, sollten Sie toLocaleString() aus dem JavaScript Nummer Klasse, da sie die Zeichenkette für die Region des Benutzers formatieren wird.

Das JavaScript Datum Klasse kann lokalisierte Daten und Zeiten formatieren.

9voto

Thiago Mata Punkte 2583

Ich habe eine Lösung, die der von Peter sehr ähnlich ist, aber sie befasst sich mit dem Zahlen- und Objektfall.

if (!String.prototype.format) {
  String.prototype.format = function() {
    var args;
    args = arguments;
    if (args.length === 1 && args[0] !== null && typeof args[0] === 'object') {
      args = args[0];
    }
    return this.replace(/{([^}]*)}/g, function(match, key) {
      return (typeof args[key] !== "undefined" ? args[key] : match);
    });
  };
}

Vielleicht könnte es noch besser sein, um mit allen tiefen Fällen fertig zu werden, aber für meine Bedürfnisse ist das genau richtig.

"This is an example from {name}".format({name:"Blaine"});
"This is an example from {0}".format("Blaine");

PS: Diese Funktion ist sehr nützlich, wenn Sie Übersetzungen in Vorlagen-Frameworks wie AngularJS :

<h1> {{('hello-message'|translate).format(user)}} <h1>
<h1> {{('hello-by-name'|translate).format( user ? user.name : 'You' )}} <h1>

Wo die en.json etwa so aussieht

{
    "hello-message": "Hello {name}, welcome.",
    "hello-by-name": "Hello {0}, welcome."
}

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