String.format = String.format || function (format) {
var params = [].splice.call(arguments, 1), nextOpen, nextClose = 0, index, plValue, spaces, totalSpaces,
removeCharAt = function (text, pos) {
return text.substr(0, pos) + text.substr(pos + 1, text.length);
};
while ((nextOpen = format.indexOf('{', nextClose)) >= 0) {
if (isNaN(+format[nextOpen+1])) {
if (format[nextOpen+1] === "{") {
format = removeCharAt(format, nextOpen + 1);
format = removeCharAt(format, format.indexOf('}', nextOpen-1));
nextClose++;
continue;
}
nextClose = nextOpen + 1;
continue;
}
nextClose = format.indexOf('}', nextOpen);
index = format.substring(nextOpen + 1, nextClose);
if (index.indexOf(',') > 0) {
spaces = +index.substring(index.indexOf(',') + 1);
index = +index.substring(0, index.indexOf(','));
}
plValue = params[index] + '';
if (spaces) {
totalSpaces = new Array(Math.abs(spaces) - plValue.length + 1).join(" ");
plValue = spaces > 0 ? totalSpaces + plValue : plValue + totalSpaces;
}
format = format.substring(0, nextOpen) + ((!plValue && plValue !== 0) ? "" : plValue) + format.substring(nextClose + 1);
nextClose = nextOpen + plValue.length - 1;
spaces = 0;
}
return format;
};
Usage
String.format("Hello {0} {1}", "Andreas", "Grech"); // "Hello Andreas Grech"
for (var i = 0; i <= 1000; i += 200) {
String.format("{0, 5}. Something", i);
}
/* Output:
0. Something
200. Something
400. Something
600. Something
800. Something
1000. Something
*/
String.format("Padded from {0, 7} left", "the"); // "Padded from the left"
String.format("{{0}}", "Ignored"); // "{0}"
String.format("{{{0}}}", "Not ignored"); // "{Not ignored}"
String.format("{{{{0}}}}", "Seeing the pattern?"); // "{{0}}"
String.format("{{{{{0}}}}}", "This is getting mental"); // "{{This is getting mental}}"
You can fork this project at github: https://github.com/dreasgrech/JSStringFormat