Domanda JavaScript equivalente a printf / String.Format


Sto cercando un buon equivalente JavaScript del C / PHP printf() o per programmatori C # / Java, String.Format() (IFormatProvider per .NET).

Il mio requisito di base è un formato di separatore di migliaia per i numeri per ora, ma qualcosa che gestisce molte combinazioni (comprese le date) sarebbe buono.

Mi rendo conto di Microsoft Ajax libreria fornisce una versione di String.Format()ma non vogliamo l'intero overhead di quel framework.


1604
2018-01-12 20:02


origine


risposte:


Provare sprintf () per JavaScript.


AggiornareOk, se vuoi davvero fare un semplice metodo di formattazione da solo, non fare le sostituzioni successivamente, ma fallo simultaneamente.

Poiché la maggior parte delle altre proposte citate fallisce quando una stringa di sostituzione della sostituzione precedente contiene anche una sequenza di formato come questa:

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

Normalmente ti aspetteresti che l'output sia {1}{0} ma l'output effettivo è {1}{1}. Quindi fai una sostituzione simultanea, invece, come in suggerimento di fearphage.


683



Basandosi sulle soluzioni precedentemente suggerite:

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

uscite

ASP è morto, ma ASP.NET è vivo! ASP {2}


Se preferisci non modificare StringIl prototipo:

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

Ti dà il molto più familiare:

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

con lo stesso risultato:

ASP è morto, ma ASP.NET è vivo! ASP {2}


1278



È divertente perché Stack Overflow ha in realtà una propria funzione di formattazione per String prototipo chiamato formatUnicorn. Provalo! Vai nella console e digita qualcosa come:

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

Firebug

Ottieni questo risultato:

Hello, Gabriel, are you feeling OK?

Puoi usare oggetti, matrici e stringhe come argomenti! Ho ottenuto il suo codice e l'ho rielaborato per produrre una nuova versione di 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;
};

Nota l'intelligente Array.prototype.slice.call(arguments) chiamata - ciò significa che se si introducono argomenti che sono stringhe o numeri, non un singolo oggetto in stile JSON, si ottiene C # String.Format comportamento quasi esattamente.

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

È perché Array'S slice costringerà tutto ciò che c'è dentro arguments in un Array, se originariamente o no, e il key sarà l'indice (0, 1, 2 ...) di ogni elemento dell'array coercitato in una stringa (ad esempio, "0", quindi "\\{0\\}" per il tuo primo schema regexp).

Neat.


365



Formattazione numerica in JavaScript

Sono arrivato a questa pagina delle domande nella speranza di scoprire come numeri di formato in JavaScript, senza introdurre un'altra libreria. Ecco cosa ho trovato:

Arrotondare i numeri a virgola mobile

L'equivalente di sprintf("%.2f", num) sembra essere in JavaScript num.toFixed(2), quali formati num a 2 cifre decimali, con arrotondamento (ma vedi il commento di @ ars265 a riguardo Math.round sotto).

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

Forma esponenziale

L'equivalente di sprintf("%.2e", num) è num.toExponential(2).

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

Esadecimale e altre basi

Per stampare numeri in base B, prova num.toString(B). JavaScript supporta la conversione automatica da e verso le basi da 2 a 36 (in aggiunta, alcuni browser hanno supporto limitato per la codifica base64).

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

Pagine di riferimento

Esercitazione rapida sulla formattazione del numero JS

Pagina di riferimento Mozilla per toFixed () (con collegamenti a toPrecision (), toExponential (), aLocaleString (), ...)


288



jsxt, Zippo

Questa opzione si adatta meglio.

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

Con questa opzione posso sostituire stringhe come queste:

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

Con il tuo codice il secondo {0} non verrebbe sostituito. ;)


168



Da ES6 su che potresti usare stringhe di modelli:

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

Tieni presente che le stringhe del modello sono circondato da apici inversi `invece di (singole) virgolette.

Per maggiori informazioni:

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

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

Nota: Controlla il sito di mozilla per trovare un elenco di browser supportati.


168



Io uso questa semplice funzione:

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

È molto simile a string.format:

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

90



Ecco un minimo implementazione di sprintf in JavaScript: fa solo "% s" e "% d", ma ho lasciato spazio per estenderlo. È inutile per l'OP, ma altre persone che si imbattono in questo thread provenienti da Google potrebbero trarne beneficio.

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

Esempio:

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

In contrasto con soluzioni simili nelle risposte precedenti, questo fa tutte le sostituzioni in un colpo solo, quindi non sostituirà le parti dei valori precedentemente sostituiti.


48