enhanced sprintf like function in Javascript

Today I’was playing with javascript and regular expression, and I made a PHP sprintf like function with some limitations and some enhancements.

The method will accept 2 parameters: the first is the string buffer that has the markers and the second parameter could be both an Object or an Array. In the first (the enhancement) case the method will replace all the occourrences of each key in the string with related value. In the second case its behavior will be the same (or at least similar) as sprintf.

As written before, there are some limitations:

  1. The method in the classic way will consider only %s and %d, %n$s and %n$d in the string buffer.
  2. Float numbers will be threated as %d.
  3. Hex values that contain at least a value between A and F will be threated as %s others as %d.
  4. Actually no string formatting is provided.
function sprintt(s, params){

        // We made a clone of the "s" string
    var newS = s,

       // and initializing a loop index
       currentIndex = 0;

    // Param will be a Json made list of placeholders.
    for(param in params){

        // Index will start by 1
        currentIndex+=1;

        if(!isNaN(param)){
            // If the params object is an indexed array

            var value = params[param];

            // Actually the method will support only numbers (d) 
            // and strings (s).
            // Float numbers will be threath as numbers.
            // Any support for octal/hex transformation.
            // Neither for string filler. 
            if(isFinite(value)){
                 param = 'd';
            }else{
                 param = 's';
            }
            // the regular expression must check only for the first 
            // occourrence of the given placeholder (as in sprintf)
            var regEx = new RegExp('%'+param);
            newS = newS.replace(regEx, value);

            // and then must replace all the %x$1 occourrences in the 
            // string, where "x" is the current index entry (as in sprintf)
            regEx = new RegExp('%'+currentIndex + '$'+param, 'g');
        }else{
            // Else we have a json "key/value" pair object and we have 
            // to replace all the given tokens
            var regEx = new RegExp('%'+param, 'g');
            value = params[param];
        }
        newS = newS.replace(regEx, value);

    }
    return newS;
}

Here there are two ways to use it:

// Example #1: Standard way 
// Output of will be: "Visit http://diegolamonica.info every 10 days! Diego will thanks you!"
alert( 
    sprintt(
        'Visit %s every %d days! %s will thanks you!', 
        [ 
            'http://diegolamonica.info',
            'Diego',
            10
        ]
    ) 
);
// Example #2 - Enhanced mode
// Output of will be: "Visit http://diegolamonica.info every 10 days! Diego will thanks you!"

alert(
    sprintt(
       'Visit %url every %numberOfDays days! %name will thanks you!',
       {
           url: 'http://diegolamonica.info',
           numberOfDays: 10,
           name: 'Diego'
       }
    )
);

Feel free to use it wherever you want, if you did some enhancement of the above code please, tell me, I will glad to post it here!

 


Commenti

3 risposte a “enhanced sprintf like function in Javascript”

  1. […] Enhanced sprintf like function in Javascript […]

  2. Hi,
    did you consider different number formatting options, like dot vs comma etc…

    BTW – I know that it’s not the same, but there is a supplant function from Douglas Crockford that works in a similar way – http://javascript.crockford.com/remedial.html

    1. Hi Bojan,
      thanks for your reply, in this days I’m working to the new version of that method. Maybe I will post news about it in one of the next weeks. :)

      As you’ve written the “supplant” method is not the same: the method implemented by Douglas Crockford become a String’s object method via String.prototype mine instead is a standalone method and nearest to the PHP implementation of sprintf.