JavaScript equivalent to printf/String.Format

Questions : JavaScript equivalent to printf/String.Format

I’m looking for a good JavaScript equivalent of the C/PHP printf() or for C#/Java programmers, String.Format() (IFormatProvider for .NET).

My basic requirement is a thousand separator format for numbers for now, but something that handles lots of combinations (including dates) would be good.

I realize Microsoft’s Ajax library provides a version of String.Format(), but we don’t want the entire overhead of that framework.

Total Answers: 57 Answers 57


Popular Answers:

  1. Current JavaScript

    From ES6 on you could use template strings:

    let soMany = 10; console.log(`This is ${soMany} times easier!`); // "This is 10 times easier! 

    See Kim’s answer below for details.


    Older answer

    Try sprintf() for JavaScript.


    If you really want to do a simple format method on your own, don’t do the replacements successively but do them simultaneously.

    Because most of the other proposals that are mentioned fail when a replace string of previous replacement does also contain a format sequence like this:

    "{0}{1}".format("{1}", "{0}") 

    Normally you would expect the output to be {1}{0} but the actual output is {1}{1}. So do a simultaneously replacement instead like in fearphage’s suggestion.

  2. Building on the previously suggested solutions:

    // First, checks if it isn't implemented yet. if (!String.prototype.format) { String.prototype.format = function() { var args = arguments; return this.replace(/{(d+)}/g, function(match, number) { return typeof args[number] != 'undefined' ? args[number] : match ; }); }; } 

    "{0} is dead, but {1} is alive! {0} {2}".format("ASP", "ASP.NET")

    outputs

    ASP is dead, but ASP.NET is alive! ASP {2}


    If you prefer not to modify String‘s prototype:

    if (!String.format) { String.format = function(format) { var args = Array.prototype.slice.call(arguments, 1); return format.replace(/{(d+)}/g, function(match, number) { return typeof args[number] != 'undefined' ? args[number] : match ; }); }; } 

    Gives you the much more familiar:

    String.format('{0} is dead, but {1} is alive! {0} {2}', 'ASP', 'ASP.NET');

    with the same result:

    ASP is dead, but ASP.NET is alive! ASP {2}

  3. It’s funny because Stack Overflow actually has their own formatting function for the String prototype called formatUnicorn. Try it! Go into the console and type something like:

    "Hello, {name}, are you feeling {adjective}?".formatUnicorn({name:"Gabriel", adjective: "OK"}); 

    Firebug

    You get this output:

    Hello, Gabriel, are you feeling OK?

    You can use objects, arrays, and strings as arguments! I got its code and reworked it to produce a new version of String.prototype.format:

    String.prototype.formatUnicorn = String.prototype.formatUnicorn || function () { "use strict"; var str = this.toString(); if (arguments.length) { var t = typeof arguments[0]; var key; var args = ("string" === t || "number" === t) ? Array.prototype.slice.call(arguments) : arguments[0]; for (key in args) { str = str.replace(new RegExp("\{" + key + "\}", "gi"), args[key]); } } return str; }; 

    Note the clever Array.prototype.slice.call(arguments) call — that means if you throw in arguments that are strings or numbers, not a single JSON-style object, you get C#’s String.Format behavior almost exactly.

    "a{0}bcd{1}ef".formatUnicorn("FOO", "BAR"); // yields "aFOObcdBARef" 

    That’s because Array‘s slice will force whatever’s in arguments into an Array, whether it was originally or not, and the key will be the index (0, 1, 2…) of each array element coerced into a string (eg, “0”, so "\{0\}" for your first regexp pattern).

    Neat.

  4. Number Formatting in JavaScript

    I got to this question page hoping to find how to format numbers in JavaScript, without introducing yet another library. Here’s what I’ve found:

    Rounding floating-point numbers

    The equivalent of sprintf("%.2f", num) in JavaScript seems to be num.toFixed(2), which formats num to 2 decimal places, with rounding (but see @ars265’s comment about Math.round below).

    (12.345).toFixed(2); // returns "12.35" (rounding!) (12.3).toFixed(2); // returns "12.30" (zero padding) 

    Exponential form

    The equivalent of sprintf("%.2e", num) is num.toExponential(2).

    (33333).toExponential(2); // "3.33e+4" 

    Hexadecimal and other bases

    To print numbers in base B, try num.toString(B). JavaScript supports automatic conversion to and from bases 2 through 36 (in addition, some browsers have limited support for base64 encoding).

    (3735928559).toString(16); // to base 16: "deadbeef" parseInt("deadbeef", 16); // from base 16: 3735928559 

    Reference Pages

    Quick tutorial on JS number formatting

    Mozilla reference page for toFixed() (with links to toPrecision(), toExponential(), toLocaleString(), …)

  5. From ES6 on you could use template strings:

    let soMany = 10; console.log(`This is ${soMany} times easier!`); // "This is 10 times easier! 

    Be aware that template strings are surrounded by backticks ` instead of (single) quotes.

    For further information:

    https://developers.google.com/web/updates/2015/01/ES6-Template-Strings

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/template_strings

    Note: Check the mozilla-site to find a list of supported browsers.

  6. jsxt, Zippo

    This option fits better.

    String.prototype.format = function() { var formatted = this; for (var i = 0; i < arguments.length; i++) { var regexp = new RegExp('\{'+i+'\}', 'gi'); formatted = formatted.replace(regexp, arguments[i]); } return formatted; }; 

    With this option I can replace strings like these:

    'The {0} is dead. Don't code {0}. Code {1} that is open source!'.format('ASP', 'PHP'); 

    With your code the second {0} wouldn’t be replaced. 😉

  7. I use this simple function:

    String.prototype.format = function() { var formatted = this; for( var arg in arguments ) { formatted = formatted.replace("{" + arg + "}", arguments[arg]); } return formatted; }; 

    That’s very similar to string.format:

    "{0} is dead, but {1} is alive!".format("ASP", "ASP.NET") 
  8. For Node.js users there is util.format which has printf-like functionality:

    util.format("%s world", "Hello") 
  9. I’m surprised no one used reduce, this is a native concise and powerful JavaScript function.

    ES6 (EcmaScript2015)

    String.prototype.format = function() { return [...arguments].reduce((p,c) => p.replace(/%s/,c), this); }; console.log('Is that a %s or a %s?... No, it's %s!'.format('plane', 'bird', 'SOman'));

    < ES6

    function interpolate(theString, argumentArray) { var regex = /%s/; var _r=function(p,c){return p.replace(regex,c);} return argumentArray.reduce(_r, theString); } interpolate("%s, %s and %s", ["Me", "myself", "I"]); // "Me, myself and I" 

    How it works:

    reduce applies a function against an accumulator and each element in the array (from left to right) to reduce it to a single value.

    var _r= function(p,c){return p.replace(/%s/,c)}; console.log( ["a", "b", "c"].reduce(_r, "[%s], [%s] and [%s]") + 'n', [1, 2, 3].reduce(_r, "%s+%s=%s") + 'n', ["cool", 1337, "stuff"].reduce(_r, "%s %s %s") );

  10. Here’s a minimal implementation of sprintf in JavaScript: it only does “%s” and “%d”, but I have left space for it to be extended. It is useless to the OP, but other people who stumble across this thread coming from Google might benefit from it.

    function sprintf() { var args = arguments, string = args[0], i = 1; return string.replace(/%((%)|s|d)/g, function (m) { // m is the matched format, e.g. %s, %d var val = null; if (m[2]) { val = m[2]; } else { val = args[i]; // A switch statement so that the formatter can be extended. Default is %s switch (m) { case '%d': val = parseFloat(val); if (isNaN(val)) { val = 0; } break; } i++; } return val; }); } 

    Example:

    alert(sprintf('Latitude: %s, Longitude: %s, Count: %d', 41.847, -87.661, 'two')); // Expected output: Latitude: 41.847, Longitude: -87.661, Count: 0 

    In contrast with similar solutions in previous replies, this one does all substitutions in one go, so it will not replace parts of previously replaced values.

  11. JavaScript programmers can use String.prototype.sprintf at https://github.com/ildar-shaimordanov/jsxt/blob/master/js/String.js. Below is example:

    var d = new Date(); var dateStr = '%02d:%02d:%02d'.sprintf( d.getHours(), d.getMinutes(), d.getSeconds()); 
  12. 3 different ways to format javascript string

    There are 3 different ways to format a string by replacing placeholders with the variable value.

    1. Using template literal (backticks “)

      let name = 'John'; let age = 30; // using backticks console.log(`${name} is ${age} years old.`); // John is 30 years old.

    2. Using concatenation

    let name = 'John'; let age = 30; // using concatenation console.log(name + ' is ' + age + ' years old.'); // John is 30 years old.

    1. Creating own format function
    String.prototype.format = function () { var args = arguments; return this.replace(/{([0-9]+)}/g, function (match, index) { // check if the argument is there return typeof args[index] == 'undefined' ? match : args[index]; }); }; console.log('{0} is {1} years old.'.format('John', 30));

  13. Adding to zippoxer‘s answer, I use this function:

    String.prototype.format = function () { var a = this, b; for (b in arguments) { a = a.replace(/%[a-z]/, arguments[b]); } return a; // Make chainable }; var s = 'Hello %s The magic number is %d.'; s.format('world!', 12); // Hello World! The magic number is 12. 

    I also have a non-prototype version which I use more often for its Java-like syntax:

    function format() { var a, b, c; a = arguments[0]; b = []; for(c = 1; c < arguments.length; c++){ b.push(arguments[c]); } for (c in b) { a = a.replace(/%[a-z]/, b[c]); } return a; } format('%d ducks, 55 %s', 12, 'cats'); // 12 ducks, 55 cats 

    ES 2015 update

    All the cool new stuff in ES 2015 makes this a lot easier:

    function format(fmt, ...args){ return fmt .split("%%") .reduce((aggregate, chunk, i) => aggregate + chunk + (args[i] || ""), ""); } format("Hello %%! I ate %% apples today.", "World", 44); // "Hello World, I ate 44 apples today." 

    I figured that since this, like the older ones, doesn’t actually parse the letters, it might as well just use a single token %%. This has the benefit of being obvious and not making it difficult to use a single %. However, if you need %% for some reason, you would need to replace it with itself:

    format("I love percentage signs! %%", "%%"); // "I love percentage signs! %%" 
  14. I want to share my solution for the ‘problem’. I haven’t re-invented the wheel but tries to find a solution based on what JavaScript already does. The advantage is, that you get all implicit conversions for free. Setting the prototype property $ of String gives a very nice and compact syntax (see examples below). It is maybe not the most efficient way, but in most cases dealing with output it does not have to be super optimized.

    String.form = function(str, arr) { var i = -1; function callback(exp, p0, p1, p2, p3, p4) { if (exp=='%%') return '%'; if (arr[++i]===undefined) return undefined; exp = p2 ? parseInt(p2.substr(1)) : undefined; var base = p3 ? parseInt(p3.substr(1)) : undefined; var val; switch (p4) { case 's': val = arr[i]; break; case 'c': val = arr[i][0]; break; case 'f': val = parseFloat(arr[i]).toFixed(exp); break; case 'p': val = parseFloat(arr[i]).toPrecision(exp); break; case 'e': val = parseFloat(arr[i]).toExponential(exp); break; case 'x': val = parseInt(arr[i]).toString(base?base:16); break; case 'd': val = parseFloat(parseInt(arr[i], base?base:10).toPrecision(exp)).toFixed(0); break; } val = typeof(val)=='object' ? JSON.stringify(val) : val.toString(base); var sz = parseInt(p1); /* padding size */ var ch = p1 && p1[0]=='0' ? '0' : ' '; /* isnull? */ while (val.length<sz) val = p0 !== undefined ? val+ch : ch+val; /* isminus? */ return val; } var regex = /%(-)?(0?[0-9]+)?([.][0-9]+)?([#][0-9]+)?([scfpexd%])/g; return str.replace(regex, callback); } String.prototype.$ = function() { return String.form(this, Array.prototype.slice.call(arguments)); } 

    Here are a few examples:

    String.format("%s %s", [ "This is a string", 11 ]) console.log("%s %s".$("This is a string", 11)) var arr = [ "12.3", 13.6 ]; console.log("Array: %s".$(arr)); var obj = { test:"test", id:12 }; console.log("Object: %s".$(obj)); console.log("%c", "Test"); console.log("%5d".$(12)); // ' 12' console.log("%05d".$(12)); // '00012' console.log("%-5d".$(12)); // '12 ' console.log("%5.2d".$(123)); // ' 120' console.log("%5.2f".$(1.1)); // ' 1.10' console.log("%10.2e".$(1.1)); // ' 1.10e+0' console.log("%5.3p".$(1.12345)); // ' 1.12' console.log("%5x".$(45054)); // ' affe' console.log("%20#2x".$("45054")); // ' 1010111111111110' console.log("%6#2d".$("111")); // ' 7' console.log("%6#16d".$("affe")); // ' 45054' 
  15. +1 Zippo with the exception that the function body needs to be as below or otherwise it appends the current string on every iteration:

    String.prototype.format = function() { var formatted = this; for (var arg in arguments) { formatted = formatted.replace("{" + arg + "}", arguments[arg]); } return formatted; }; 
  16. I use a small library called String.format for JavaScript which supports most of the format string capabilities (including format of numbers and dates), and uses the .NET syntax. The script itself is smaller than 4 kB, so it doesn’t create much of overhead.

  17. If you are looking to handle the thousands separator, you should really use toLocaleString() from the JavaScript Number class since it will format the string for the user’s region.

    The JavaScript Date class can format localized dates and times.

  18. Very elegant:
  19. The PHPJS project has written JavaScript implementations for many of PHP’s functions. Since PHP’s sprintf() function is basically the same as C’s printf(), their JavaScript implementation of it should satisfy your needs.

  20. I use this one:

    String.prototype.format = function() { var newStr = this, i = 0; while (/%s/.test(newStr)) newStr = newStr.replace("%s", arguments[i++]) return newStr; } 

    Then I call it:

    "<h1>%s</h1><p>%s</p>".format("Header", "Just a test!"); 
  21. I have a solution very close to Peter’s, but it deals with number and object case.

    if (!String.prototype.format) { String.prototype.format = function() { var args; args = arguments; if (args.length === 1 && args[0] !== null && typeof args[0] === 'object') { args = args[0]; } return this.replace(/{([^}]*)}/g, function(match, key) { return (typeof args[key] !== "undefined" ? args[key] : match); }); }; } 

    Maybe it could be even better to deal with the all deeps cases, but for my needs this is just fine.

    "This is an example from {name}".format({name:"Blaine"}); "This is an example from {0}".format("Blaine"); 

    PS: This function is very cool if you are using translations in templates frameworks like AngularJS:

    <h1> {{('hello-message'|translate).format(user)}} <h1> <h1> {{('hello-by-name'|translate).format( user ? user.name : 'You' )}} <h1> 

    Where the en.json is something like

    { "hello-message": "Hello {name}, welcome.", "hello-by-name": "Hello {0}, welcome." } 
  22. One very slightly different version, the one I prefer (this one uses {xxx} tokens rather than {0} numbered arguments, this is much more self-documenting and suits localization much better):

    String.prototype.format = function(tokens) { var formatted = this; for (var token in tokens) if (tokens.hasOwnProperty(token)) formatted = formatted.replace(RegExp("{" + token + "}", "g"), tokens[token]); return formatted; }; 

    A variation would be:

     var formatted = l(this); 

    that calls an l() localization function first.

  23. We can use a simple lightweight String.Format string operation library for Typescript.

    String.Format():

    var id = image.GetId() String.Format("image_{0}.jpg", id) output: "image_2db5da20-1c5d-4f1a-8fd4-b41e34c8c5b5.jpg"; 

    String Format for specifiers:

    var value = String.Format("{0:L}", "APPLE"); //output "apple" value = String.Format("{0:U}", "apple"); // output "APPLE" value = String.Format("{0:d}", "2017-01-23 00:00"); //output "23.01.2017" value = String.Format("{0:s}", "21.03.2017 22:15:01") //output "2017-03-21T22:15:01" value = String.Format("{0:n}", 1000000); //output "1.000.000" value = String.Format("{0:00}", 1); //output "01" 

    String Format for Objects including specifiers:

    var fruit = new Fruit(); fruit.type = "apple"; fruit.color = "RED"; fruit.shippingDate = new Date(2018, 1, 1); fruit.amount = 10000; String.Format("the {type:U} is {color:L} shipped on {shippingDate:s} with an amount of {amount:n}", fruit); // output: the APPLE is red shipped on 2018-01-01 with an amount of 10.000 
  24. For basic formatting:

    var template = jQuery.validator.format("{0} is not a valid value"); var result = template("abc"); 
  25. I have a slightly longer formatter for JavaScript here

    You can do formatting several ways:

    • String.format(input, args0, arg1, ...)
    • String.format(input, obj)
    • "literal".format(arg0, arg1, ...)
    • "literal".format(obj)

    Also, if you have say a ObjectBase.prototype.format (such as with DateJS) it will use that.

    Examples…

    var input = "numbered args ({0}-{1}-{2}-{3})"; console.log(String.format(input, "first", 2, new Date())); //Outputs "numbered args (first-2-Thu May 31 2012...Time)-{3})" console.log(input.format("first", 2, new Date())); //Outputs "numbered args(first-2-Thu May 31 2012...Time)-{3})" console.log(input.format( "object properties ({first}-{second}-{third:yyyy-MM-dd}-{fourth})" ,{ 'first':'first' ,'second':2 ,'third':new Date() //assumes Date.prototype.format method } )); //Outputs "object properties (first-2-2012-05-31-{3})" 

    I’ve also aliased with .asFormat and have some detection in place in case there’s already a string.format (such as with MS Ajax Toolkit (I hate that library).

  26. Just in case someone needs a function to prevent polluting global scope, here is the function that does the same:

     function _format (str, arr) { return str.replace(/{(d+)}/g, function (match, number) { return typeof arr[number] != 'undefined' ? arr[number] : match; }); }; 
  27. For those who like Node.JS and its util.format feature, I’ve just extracted it out into its vanilla JavaScript form (with only functions that util.format uses):

    exports = {}; function isString(arg) { return typeof arg === 'string'; } function isNull(arg) { return arg === null; } function isObject(arg) { return typeof arg === 'object' && arg !== null; } function isBoolean(arg) { return typeof arg === 'boolean'; } function isUndefined(arg) { return arg === void 0; } function stylizeNoColor(str, styleType) { return str; } function stylizeWithColor(str, styleType) { var style = inspect.styles[styleType]; if (style) { return 'u001b[' + inspect.colors[style][0] + 'm' + str + 'u001b[' + inspect.colors[style][3] + 'm'; } else { return str; } } function isFunction(arg) { return typeof arg === 'function'; } function isNumber(arg) { return typeof arg === 'number'; } function isSymbol(arg) { return typeof arg === 'symbol'; } function formatPrimitive(ctx, value) { if (isUndefined(value)) return ctx.stylize('undefined', 'undefined'); if (isString(value)) { var simple = ''' + JSON.stringify(value).replace(/^"|"$/g, '') .replace(/'/g, "\'") .replace(/\"/g, '"') + '''; return ctx.stylize(simple, 'string'); } if (isNumber(value)) { // Format -0 as '-0'. Strict equality won't distinguish 0 from -0, // so instead we use the fact that 1 / -0 < 0 whereas 1 / 0 > 0 . if (value === 0 && 1 / value < 0) return ctx.stylize('-0', 'number'); return ctx.stylize('' + value, 'number'); } if (isBoolean(value)) return ctx.stylize('' + value, 'boolean'); // For some reason typeof null is "object", so special case here. if (isNull(value)) return ctx.stylize('null', 'null'); // es6 symbol primitive if (isSymbol(value)) return ctx.stylize(value.toString(), 'symbol'); } function arrayToHash(array) { var hash = {}; array.forEach(function (val, idx) { hash[val] = true; }); return hash; } function objectToString(o) { return Object.prototype.toString.call(o); } function isDate(d) { return isObject(d) && objectToString(d) === '[object Date]'; } function isError(e) { return isObject(e) && (objectToString(e) === '[object Error]' || e instanceof Error); } function isRegExp(re) { return isObject(re) && objectToString(re) === '[object RegExp]'; } function formatError(value) { return '[' + Error.prototype.toString.call(value) + ']'; } function formatPrimitiveNoColor(ctx, value) { var stylize = ctx.stylize; ctx.stylize = stylizeNoColor; var str = formatPrimitive(ctx, value); ctx.stylize = stylize; return str; } function isArray(ar) { return Array.isArray(ar); } function hasOwnProperty(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { var name, str, desc; desc = Object.getOwnPropertyDescriptor(value, key) || {value: value[key]}; if (desc.get) { if (desc.set) { str = ctx.stylize('[Getter/Setter]', 'special'); } else { str = ctx.stylize('[Getter]', 'special'); } } else { if (desc.set) { str = ctx.stylize('[Setter]', 'special'); } } if (!hasOwnProperty(visibleKeys, key)) { name = '[' + key + ']'; } if (!str) { if (ctx.seen.indexOf(desc.value) < 0) { if (isNull(recurseTimes)) { str = formatValue(ctx, desc.value, null); } else { str = formatValue(ctx, desc.value, recurseTimes - 1); } if (str.indexOf('n') > -1) { if (array) { str = str.split('n').map(function (line) { return ' ' + line; }).join('n').substr(2); } else { str = 'n' + str.split('n').map(function (line) { return ' ' + line; }).join('n'); } } } else { str = ctx.stylize('[Circular]', 'special'); } } if (isUndefined(name)) { if (array && key.match(/^d+$/)) { return str; } name = JSON.stringify('' + key); if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { name = name.substr(1, name.length - 2); name = ctx.stylize(name, 'name'); } else { name = name.replace(/'/g, "\'") .replace(/\"/g, '"') .replace(/(^"|"$)/g, "'") .replace(/\\/g, '\'); name = ctx.stylize(name, 'string'); } } return name + ': ' + str; } function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { var output = []; for (var i = 0, l = value.length; i < l; ++i) { if (hasOwnProperty(value, String(i))) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, String(i), true)); } else { output.push(''); } } keys.forEach(function (key) { if (!key.match(/^d+$/)) { output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, key, true)); } }); return output; } function reduceToSingleString(output, base, braces) { var length = output.reduce(function (prev, cur) { return prev + cur.replace(/u001b[dd?m/g, '').length + 1; }, 0); if (length > 60) { return braces[0] + (base === '' ? '' : base + 'n ') + ' ' + output.join(',n ') + ' ' + braces[1]; } return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; } function formatValue(ctx, value, recurseTimes) { // Provide a hook for user-specified inspect functions. // Check that value is an object with an inspect function on it if (ctx.customInspect && value && isFunction(value.inspect) && // Filter out the util module, it's inspect function is special value.inspect !== exports.inspect && // Also filter out any prototype objects using the circular check. !(value.constructor && value.constructor.prototype === value)) { var ret = value.inspect(recurseTimes, ctx); if (!isString(ret)) { ret = formatValue(ctx, ret, recurseTimes); } return ret; } // Primitive types cannot have properties var primitive = formatPrimitive(ctx, value); if (primitive) { return primitive; } // Look up the keys of the object. var keys = Object.keys(value); var visibleKeys = arrayToHash(keys); if (ctx.showHidden) { keys = Object.getOwnPropertyNames(value); } // This could be a boxed primitive (new String(), etc.), check valueOf() // NOTE: Avoid calling `valueOf` on `Date` instance because it will return // a number which, when object has some additional user-stored `keys`, // will be printed out. var formatted; var raw = value; try { // the .valueOf() call can fail for a multitude of reasons if (!isDate(value)) raw = value.valueOf(); } catch (e) { // ignore... } if (isString(raw)) { // for boxed Strings, we have to remove the 0-n indexed entries, // since they just noisey up the output and are redundant keys = keys.filter(function (key) { return !(key >= 0 && key < raw.length); }); } // Some type of object without properties can be shortcutted. if (keys.length === 0) { if (isFunction(value)) { var name = value.name ? ': ' + value.name : ''; return ctx.stylize('[Function' + name + ']', 'special'); } if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } if (isDate(value)) { return ctx.stylize(Date.prototype.toString.call(value), 'date'); } if (isError(value)) { return formatError(value); } // now check the `raw` value to handle boxed primitives if (isString(raw)) { formatted = formatPrimitiveNoColor(ctx, raw); return ctx.stylize('[String: ' + formatted + ']', 'string'); } if (isNumber(raw)) { formatted = formatPrimitiveNoColor(ctx, raw); return ctx.stylize('[Number: ' + formatted + ']', 'number'); } if (isBoolean(raw)) { formatted = formatPrimitiveNoColor(ctx, raw); return ctx.stylize('[Boolean: ' + formatted + ']', 'boolean'); } } var base = '', array = false, braces = ['{', '}']; // Make Array say that they are Array if (isArray(value)) { array = true; braces = ['[', ']']; } // Make functions say that they are functions if (isFunction(value)) { var n = value.name ? ': ' + value.name : ''; base = ' [Function' + n + ']'; } // Make RegExps say that they are RegExps if (isRegExp(value)) { base = ' ' + RegExp.prototype.toString.call(value); } // Make dates with properties first say the date if (isDate(value)) { base = ' ' + Date.prototype.toUTCString.call(value); } // Make error with message first say the error if (isError(value)) { base = ' ' + formatError(value); } // Make boxed primitive Strings look like such if (isString(raw)) { formatted = formatPrimitiveNoColor(ctx, raw); base = ' ' + '[String: ' + formatted + ']'; } // Make boxed primitive Numbers look like such if (isNumber(raw)) { formatted = formatPrimitiveNoColor(ctx, raw); base = ' ' + '[Number: ' + formatted + ']'; } // Make boxed primitive Booleans look like such if (isBoolean(raw)) { formatted = formatPrimitiveNoColor(ctx, raw); base = ' ' + '[Boolean: ' + formatted + ']'; } if (keys.length === 0 && (!array || value.length === 0)) { return braces[0] + base + braces[1]; } if (recurseTimes < 0) { if (isRegExp(value)) { return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); } else { return ctx.stylize('[Object]', 'special'); } } ctx.seen.push(value); var output; if (array) { output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); } else { output = keys.map(function (key) { return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); }); } ctx.seen.pop(); return reduceToSingleString(output, base, braces); } function inspect(obj, opts) { // default options var ctx = { seen: [], stylize: stylizeNoColor }; // legacy... if (arguments.length >= 3) ctx.depth = arguments[2]; if (arguments.length >= 4) ctx.colors = arguments[3]; if (isBoolean(opts)) { // legacy... ctx.showHidden = opts; } else if (opts) { // got an "options" object exports._extend(ctx, opts); } <
  28. Using Lodash you can get template functionality:

    Use the ES template literal delimiter as an "interpolate" delimiter. Disable support by replacing the "interpolate" delimiter.

    var compiled = _.template('hello ${ user }!'); compiled({ 'user': 'pebbles' }); // => 'hello pebbles! 
  29. I didn't see pyformat in the list so I thought I'd throw it in:

    console.log(pyformat( 'The {} {} jumped over the {}' , ['brown' ,'fox' ,'foobar'] )) console.log(pyformat('The {0} {1} jumped over the {1}' , ['brown' ,'fox' ,'foobar'] )) console.log(pyformat('The {color} {animal} jumped over the {thing}' , [] ,{color: 'brown' ,animal: 'fox' ,thing: 'foobaz'} )) 
  30. /** * Format string by replacing placeholders with value from element with * corresponsing index in `replacementArray`. * Replaces are made simultaneously, so that replacement values like * '{1}' will not mess up the function. * * Example 1: * ('{2} {1} {0}', ['three', 'two' ,'one']) -> 'one two three' * * Example 2: * ('{0}{1}', ['{1}', '{0}']) -> '{1}{0}' */ function stringFormat(formatString, replacementArray) { return formatString.replace( /{(d+)}/g, // Matches placeholders, e.g. '{1}' function formatStringReplacer(match, placeholderIndex) { // Convert String to Number placeholderIndex = Number(placeholderIndex); // Make sure that index is within replacement array bounds if (placeholderIndex < 0 || placeholderIndex > replacementArray.length - 1 ) { return placeholderIndex; } // Replace placeholder with value from replacement array return replacementArray[placeholderIndex]; } ); } 
  31. another suggestion is you use the string template:

    const getPathDadosCidades = (id: string) => `/clientes/${id}` const getPathDadosCidades = (id: string, role: string) => `/clientes/${id}/roles/${role}` 
  32. I did not see the String.format variant:

    String.format = function (string) { var args = Array.prototype.slice.call(arguments, 1, arguments.length); return string.replace(/{(d+)}/g, function (match, number) { return typeof args[number] != "undefined" ? args[number] : match; }); }; 
  33. String.prototype.format = function () { var formatted = this; for (var prop in arguments[0]) { var regexp = new RegExp('\{' + prop + '\}', 'gi'); formatted = formatted.replace(regexp, arguments[0][prop]); } return formatted; };
  34. With sprintf.js in place - one can make a nifty little format-thingy

    String.prototype.format = function(){ var _args = arguments Array.prototype.unshift.apply(_args,[this]) return sprintf.apply(undefined,_args) } // this gives you: "{%1$s}{%2$s}".format("1", "0") // {1}{0} 
  35. There is also Globalize.format in the jQuery Globalize project, the official globalization service for jQuery UI. IT's nice when you need culture-aware formatting.

  36. I needed a function which could format a price (given in cents) in a way preferred by the user, and the tricky part is that the format is specified by the user -- and I do not expect my users to understand printf-like syntax, or regexps, etc. My solution is somewhat similar to that used in Basic, so the user just marks with # places for digits, for example:

    simple_format(1234567,"$ ###,###,###.##") "$ 12,345.67" simple_format(1234567,"### ### ###,## pln") "12 345,67 pln" 

    I believe this is quite easy to understand by user, and quite easy to implement:

    function simple_format(integer,format){ var text = ""; for(var i=format.length;i--;){ if(format[i]=='#'){ text = (integer%10) + text; integer=Math.floor(integer/10); if(integer==0){ return format.substr(0,i).replace(/#(.*#)?/,"")+text; } }else{ text = format[i] + text; } } return text; } 
  37. arg function:

    /** * Qt stil arg() * var scr = "<div id='%1' class='%2'></div>".arg("mydiv").arg("mydivClass"); */ String.prototype.arg = function() { var signIndex = this.indexOf("%"); var result = this; if (signIndex > -1 && arguments.length > 0) { var argNumber = this.charAt(signIndex + 1); var _arg = "%"+argNumber; var argCount = this.split(_arg); for (var itemIndex = 0; itemIndex < argCount.length; itemIndex++) { result = result.replace(_arg, arguments[0]); } } return result; } 
  38. String.prototype.format = function(){ var final = String(this); for(let i=0; i<arguments.length;i++){ final = final.replace(`%s${i+1}`, arguments[i]) } return final || '' } console.log(("hello %s2 how %s3 you %s1").format('hi', 'hello', 'how'));
    <h1 id="text"> </h1>

  39. In typescript create a file named format.ts and import it whatever you need to use formatting.

    // contents of format.ts interface String { format(...args: any[]): string; } if (!String.prototype.format) { String.prototype.format = function() { let a = this; let b: any; // tslint:disable-next-line: forin for (b in arguments) { a = a.replace(/%[a-z]/, arguments[b]); } return a; }; } 

    To format string use this code:

    import './format'; console.log('Hello, %s!'.format('World')); 

    Example

    String.prototype.format = function() { let a = this; let b; for (b in arguments) { a = a.replace(/%[a-z]/, arguments[b]); } return a; }; console.log('Hello, %s!'.format('World'));

  40. if you just need to format a string with %s specifier only

    function _sprintf(message){ const regexp = RegExp('%s','g'); let match; let index = 1; while((match = regexp.exec(message)) !== null) { let replacement = arguments[index]; if (replacement) { let messageToArray = message.split(''); messageToArray.splice(match.index, regexp.lastIndex - match.index, replacement); message = messageToArray.join(''); index++; } else { break; } } return message; } _sprintf("my name is %s, my age is %s", "bob", 50); // my name is bob, my age is 50 
  41. Right now, there is a package called locutus which translate the functions of other languages to Javascript such as php, python, ruby etc.

    const printf = require('locutus/php/strings/printf') printf('Hello world'); 

    You can try this playground codesandbox

  42. Ok, so first we'll set up some variables to use:

     const date = new Date(); const locale = 'en-us'; const wDay = date.toLocaleString(locale, {weekday: 'short'}); const month = date.toLocaleString(locale, {month: 'long'}); const year = date.toLocaleString(locale, {year: 'numeric'}); const minute = date.toLocaleString(locale, {minute: 'numeric'}); const [hour, ap] = date.toLocaleString(locale, {hour: 'numeric', hour12:true}).split(' '); let mDay = date.toLocaleString(locale, {day: 'numeric'}); switch(mDay % 10) { case 1: mDay += 'st'; break; case 2: mDay += 'nd'; break; case 3: mDay += 'rd'; break; default: mDay += 'th'; break; } 

    Now that we've got all that, we can format a string like so:

     const formatter = (...a) => `${a[0]}, the ${a[1]} of ${a[2]} ${a[3]} at ${a[4]}:${a[5]} ${a[6]}`; const formatted = formatter(wDay, mDay, month, year, hour, minute, ap); 

    We could even use named paramaters for the "formatter" function:

     const formatter = (wDay, mDay, month, year, hour, minute, ap) => `${wDay}, the ${mDay} of ${month} ${year} at ${hour}:${minute} ${ap}`; const formatted = formatter(wDay, mDay, month, year, hour, minute, ap); 

    If you'll notice, the JS templates above are both the results of callbacks. If the entire piece of code above were encapsulated within a function that was expected to return a formatted date, it would not be hard to imagine how to construct an arbitrary "formatter" function in the same manner, that could be passed in from outside.

    tl;dr you can re-use template literals if you put them inside callbacks and use the args as the replacements.

  43. String.prototype.format = function format() { var msg = this; for(var i in arguments) msg = msg.replace(/{}/,arguments[i]).replace(new RegExp('\{'+i+'\}','g'),arguments[i]); return msg; }
  44. You can use this function

     String.prototype.format = function (args) { var str = this; return str.replace(String.prototype.format.regex, function(item) { var intVal = parseInt(item.substring(1, item.length - 1)); var replace; if (intVal >= 0) { replace = args[intVal]; } else if (intVal === -1) { replace = "{"; } else if (intVal === -2) { replace = "}"; } else { replace = ""; } return replace; }); }; String.prototype.format.regex = new RegExp("{-?[0-9]+}", "g"); // Sample usage. var str = "She {1} {0}{2} by the {0}{3}. {-1}^_^{-2}"; str = str.format(["sea", "sells", "shells", "shore"]); alert(str); 
  45. bobjs can do this:

    var sFormat = "My name is {0} and I am {1} years old."; var result = bob.string.formatString(sFormat, "Bob", 29); console.log(result); //output:  //==========  // My name is Bob and I am 29 years old.  
  46. String.prototype.repeat = function(n) { return new Array(++n).join(this); }; String.prototype.pad = function(requiredLength, paddingStr, paddingType) { var n = requiredLength - this.length; if (n) { paddingType = paddingType ? paddingType.toLowerCase() : ''; paddingStr = paddingStr || ' '; paddingStr = paddingStr.repeat( Math.ceil(n / paddingStr.length) ).substr(0, n); if (paddingType == 'both') { n /= 2; return paddingStr.substr( 0, Math.ceil(n) ) + this + paddingStr.substr( 0, Math.floor(n) ); } if (paddingType == 'left') { return paddingStr + this; } return this + paddingStr; } return this; }; // синтаксис аналогичен printf // 'Привет, %s!'.format('мир') -> "Привет, мир!" // '%.1s.%.1s. %s'.format('Иван', 'Иванович', 'Иванов') -> "И.И. Иванов" String.prototype.format = function() { var i = 0, params = arguments; return this.replace(/%(?:%|(?:(|[+-]+)(|0|'.+?)([1-9]d*)?(?:.([1-9]d*))?)?(s|d|f))/g, function(match, sign, padding, width, precision, type) { if (match == '%%') { return '%'; } var v = params[i++]; if (type == 'd') { v = Math.round(v); } else if (type == 'f') { v = v.toFixed(precision ? precision : 6); } if (/+/.test(sign) && v > 0) { v = '+' + v; } v += ''; if (type != 'f' && precision) { v = v.substr(0, precision); } if (width) { v = v.pad(width, padding == '' ? ' ' : padding[0] == "'" ? padding.substr(1) : padding, /-/.test(sign) ? 'right' : 'left'); } return v; }); }; // this.name = 'Вася'; // console.log( 'Привет, ${name}!'.template(this) ); // "Привет, Вася!" String.prototype.template = function(context) { return this.replace(/${(.*?)}/g, function(match, name) { return context[name]; }); };

Tasg: javascript, printf

Answer Link
jidam
  • Unable to run NoraUI mvn verify goal
  • Unable to run my app on emulator in VS Code
  • Unable to run multiple instances of libVLC(MobileVLCKit) in IOS via flutter framework
  • Unable to run make on griddb source on ubuntu 20.04 (building from source)
  • Unable to run latexindent macOS Monterey 12.0.1
  • Unable to run kotlinc-native command
  • Unable to run JUnit Test… Java.lang.ExceptionInInitializerError (Android Studio)
  • Unable to run java with -Xmx > 966m
  • Unable to run ionic cap run android from wsl2 inorder to start android emulator
  • Unable to run Intel HAXM installer: Cannot start process, the working directory does not exist
  • fs
  • Unable to run Google Analytics sample code
  • unable to run flutter run after upgarding to flutter 2.8.0 from 2.5.3
  • Unable to run Django with PostgreSQL in Docker
  • Unable to Run Container Using testcontainers
  • Unable to run ClojureScript Hello World program, Error building classpath. Error reading edn.
  • unable to run client command for apache karaf 4.3.3 through remote server
  • Unable to run c program 2nd time using eclipse
  • unable to run c++ in visual studio code on m1 chipset
  • Unable to run Android Instrumented Tests
  • Unable to run adb, check your Android SDK installation and ANDROID_SDK_ROOT environment variable: …AndroidSdkplatform-toolsadb.exe
  • Unable to run a singlespecific .spec.ts file through angular cli using ng test –include option
  • Unable to run a Mango query
  • Unable to return response back to view in laravel from package
  • Unable to return object reference in std::optional
  • Unable to return NULL in a function that expects an integer return type
  • Unable to return correct change in JavaScript Cash Register
  • Unable to retrieve version information from Elasticsearch nodes. Request timed out
  • Unable to retrieve values from Axios Response data
  • Unable to retrieve dotenv JWT secret Error: secretOrPrivateKey must have a value
  • Unable to resolve your shell environment
  • Unable to resolve token for FCM while implementing Push notification for Xamarin
  • Unable to resolve the request yii
  • Unable to resolve service for type Swashbuckle.AspNetCore.Swagger.ISwaggerProvider
  • Unable to resolve service for type Microsoft.EntityFrameworkCore.Diagnostics.IDiagnosticsLogger