sprintf equivalent for client-side JavaScript

后端 未结 2 1576
长情又很酷
长情又很酷 2020-12-19 16:50

I know that console.log supports at least some of the basic features of printf from C through messing around, but I was curious of a way to take ad

相关标签:
2条回答
  • Try utilizing eval , .replace

    var sprintf = function sprintf() {
      // arguments
      var args = Array.prototype.slice.call(arguments)
        // parameters for string
      , n = args.slice(1, -1)
        // string
      , text = args[0]
        // check for `Number`
      , _res = isNaN(parseInt(args[args.length - 1])) 
                 ? args[args.length - 1] 
                   // alternatively, if string passed
                   // as last argument to `sprintf`,
                   // `eval(args[args.length - 1])`
                 : Number(args[args.length - 1]) 
        // array of replacement values
      , arr = n.concat(_res)
        // `res`: `text`
      , res = text;
      // loop `arr` items
      for (var i = 0; i < arr.length; i++) {
        // replace formatted characters within `res` with `arr` at index `i`
        res = res.replace(/%d|%s/, arr[i])
      }
      // return string `res`
      return res
    };
    
    document.write(sprintf("%d plus %d is %d", 0, 1, 0 + 1) 
                   + "<br>" 
                   + sprintf("Hello, %s!", "world") 
                   + "<br>" 
                   + sprintf("The answer to everything is %d.", 42)
                  );

    0 讨论(0)
  • 2020-12-19 17:15

    Keep it simple

    var sprintf = (str, ...argv) => !argv.length ? str : 
        sprintf(str = str.replace(sprintf.token||"$", argv.shift()), ...argv);
    

    Since Javascript handles data types automatically, there is no need for type options.

    If you need padding, "15".padStart(5,"0") = ("00000"+15).slice(-5) = "00015".

    Usage

    var sprintf = (str, ...argv) => !argv.length ? str : 
        sprintf(str = str.replace(sprintf.token||"$", argv.shift()), ...argv);
    
    alert(sprintf("Success after $ clicks ($ seconds).", 15, 4.569));
    sprintf.token = "_";
    alert(sprintf("Failure after _ clicks (_ seconds).", 5, 1.569));
    
    sprintf.token = "%";
    var a = "%<br>%<br>%";
    var b = sprintf("% plus % is %", 0, 1, 0 + 1);
    var c = sprintf("Hello, %!", "world");
    var d = sprintf("The answer to everything is %.", 42);
    document.write(sprintf(a,b,c,d));

    0 讨论(0)
提交回复
热议问题