RSS Feed

Javascript printf

29.05.2006 by naden

Die Funktionen und sprintf sind sehr nützlich um vielfältige Information als String zu formatieren. In 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.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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.

Teile diesen Beitrag

Folge mir

TwitterGoogle+XingFacebookRSS-Feed

Ähnliche Beiträge


5 Kommentare »

  1. Baby Herman sagt:

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

  2. Baby Herman sagt:

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

  3. naden sagt:

    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.

  4. naden sagt:

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

  5. BananaAcid sagt:

    Slight modification to make it even more usefull… :-D should be comined with the array version. will see if can consolidate both code blocks.

    String.prototype.sprintf = function() {
    if( arguments.length < 1 ) {
    return this;
    }

    var data = this; //arguments[ 0 ];

    for( var k=0; k<arguments.length; ++k ) {

    switch( typeof( arguments[ k ] ) )
    {
    case 'string':
    data = data.replace( /%s/, arguments[ k ] );
    break;
    case 'number':
    data = data.replace( /%d/, arguments[ k ] );
    break;
    case 'boolean':
    data = data.replace( /%b/, arguments[ k ] ? 'true' : 'false' );
    break;
    default:
    /// function | object | undefined
    break;
    }
    }
    return( data );
    }

    var x= "My cat %d likes fish!".sprintf("Joy");

    document.write( x );

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>