/** * @returns {string} First letter capitalized */ String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.substring(1); } /** * Left pad * @param {string} [character="0"] * @param {int} [count=2] */ String.prototype.lpad = function(character, count) { var ch = character || "0"; var cnt = count || 2; var s = ""; while (s.length < (cnt - this.length)) { s += ch; } s = s.substring(0, cnt-this.length); return s+this; } /** * Right pad * @param {string} [character="0"] * @param {int} [count=2] */ String.prototype.rpad = function(character, count) { var ch = character || "0"; var cnt = count || 2; var s = ""; while (s.length < (cnt - this.length)) { s += ch; } s = s.substring(0, cnt-this.length); return this+s; } /** * Format a string in a flexible way. Scans for %s strings and replaces them with arguments. List of patterns is modifiable via String.format.map. * @param {string} template * @param {any} [argv] */ String.format = function(template) { var map = String.format.map; var args = Array.prototype.slice.call(arguments, 1); var replacer = function(match, group1, group2, index) { if (template.charAt(index-1) == "%") { return match.substring(1); } if (!args.length) { return match; } var obj = args[0]; var group = group1 || group2; var parts = group.split(","); var name = parts.shift(); var method = map[name.toLowerCase()]; if (!method) { return match; } var obj = args.shift(); var replaced = obj[method].apply(obj, parts); var first = name.charAt(0); if (first != first.toLowerCase()) { replaced = replaced.capitalize(); } return replaced; } return template.replace(/%(?:([a-z]+)|(?:{([^}]+)}))/gi, replacer); } String.format.map = { "s": "toString" } /** * Convenience shortcut to String.format(this) */ String.prototype.format = function() { var args = Array.prototype.slice.call(arguments); args.unshift(this); return String.format.apply(String, args); }