Javascript printf
29. Mai 2006 | In: Javascript
Die Funktionen printf und sprintf sind sehr nützlich um vielfältige Information als String zu formatieren. In Javascript jedoch wird die Stringbehandlung etwas vernachlässigt, obwohl auch hier die meisten Anwendungen String-Formatierungen benötigen.
Diese simple Implementierung von sprintf und printf hat mir oft gute Dienste geleistet.
Da es sich um eine sehr einfache Implementierung handelt sind noch keine erweiterten Zahlenformatierungen möglich.
Aufdrücke wie printf( “%.2f”, varible ); sind nicht zulässig. Z.Z. sind die Metazeichen %d für einen Zahlenwert ( INTEGER | DOUBLE ) und %s für Strings und %b für BOOLEAN erlaubt. Über eine Typen-Erkennung werden die Platzhalter automatisch ersetzt.
function sprintf() { if( sprintf.arguments.length < 2 ) { return; } var data = sprintf.arguments[ 0 ]; for( var k=1; k<sprintf.arguments.length; ++k ) { switch( typeof( sprintf.arguments[ k ] ) ) { case 'string': data = data.replace( /%s/, sprintf.arguments[ k ] ); break; case 'number': data = data.replace( /%d/, sprintf.arguments[ k ] ); break; case 'boolean': data = data.replace( /%b/, sprintf.arguments[ k ] ? 'true' : 'false' ); break; default: /// function | object | undefined break; } } return( data ); } if( !String.sprintf ) { String.sprintf = sprintf; } /// printf document.write( String.sprintf( 'Ein %s ist eine nette Sache für %d Leute.', 'Boot', 2 ) ); |
In Zeile 30 – 32 wird die Funktion im Namensraum String registriert. Eine direkter Aufruf ist natürlich ebenfalls möglich.
In Zeile 34 erfolgt der eigentliche Aufruf der Funktion mit 2 Parametern.

4 Kommentare zu Javascript printf
Baby Herman
06. Dezember 2007 um 10:34:23
Erst einmal großes Lob für die so schön einfache Lösung einer sprintf-Funktion.
Auch in PHP hat diese Funktion jedoch den Nachteil: Sie kann nicht mit Arrays umgehen. Als Lösung wird hier die vsprintf-Funktion geboten, die zusätzlich den Umgang mit Arrays bereit hält.
Hier eine kleine Erweiterung deiner Funktion für den Umgang mit Arrays:
function sprintf() {
if( sprintf.arguments.length < 2 ) return;
var data = sprintf.arguments[ 0 ];
if( typeof( sprintf.arguments[ 1 ] ) == ‘object’ ) {
var k = 0;
var replace = sprintf.arguments[ 1 ];
}
else {
var k = 1;
var replace = sprintf.arguments;
}
for( k; k switch( typeof( replace[ k ] ) ) {
case ’string’:
data = data.replace( /%s/, replace[ k ] );
break;
case ‘number’:
data = data.replace( /%d/, replace[ k ] );
break;
case ‘boolean’:
data = data.replace( /%b/, replace[ k ] ? ‘true’ : ‘false’ );
break;
default:
/// function | object | undefined
break;
}
}
return( data );
}
Baby Herman
06. Dezember 2007 um 11:41:06
Gibt es eine Möglichkeit, mein Kommentar komplett darzustellen?
naden
06. Dezember 2007 um 11:52:01
Ich hatte dir dazu eine E-Mail geschrieben. Es scheint so als ob der Content-Filter von Wordpress den Javascript-Code verschluckt. Wegen XSS etc. Wenn du mir einfach auf die Mail antwortest, dann editier ich das im Backend.
naden
07. Dezember 2007 um 16:18:54
Ist nun online. Fälle in denen als Argumente Arrays und andere Werte gemixt vorkommen werden auch hier noch nicht gehandelt. Eine Verbesserung ist es allemal.
Ein Aufruf wie der Folgende ist nun möglich:
alert( sprintf( ‘%d – %d = %d’, [ 2, 3, -1 ] ) );
Natürlich kann das Array auch eine Variable sein:
var list = [ 2, 3, -1 ];
alert( sprintf( ‘%d – %d = %d’, list ) );