naden.de Bookmarken

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.

Bewertung: najagut
Loading ... Loading ...

Ähnliche Beiträge



4 Kommentare zu Javascript printf

Avatar

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

Avatar

Baby Herman

06. Dezember 2007 um 11:41:06

Gibt es eine Möglichkeit, mein Kommentar komplett darzustellen?

Avatar

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.

Avatar

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

Schreib einen Kommentar

Fülle das Kommentar-Formular vollständig aus oder melde dich über Twitter oder Facebook an.
Sign in with Facebook

By Teledir Internetanbieter