sprintf() for Javascript
For anyone familiar with C, C++, Perl, PHP, bash, etc, you are also familiar with the printf() method. printf() allows characters in the format string to be copied to the functions outpt, or stdout, with the other parameters being rendered into the resulting text at points marked by format specifiers, which are typically introduced by a % character.
Where am I going with this lecture? Well, the sprintf() method is identicle to the printf() method with one exception. sprintf() saves the value as a string, or variable. Unfortunately, Javascript does not have a similar method. Consistancy is nice when it comes to programming environments even though not all programming languages are the same.
In any case, here's a modular sprintf() method. We didn't write the method but in researching sprintf() for Javascript, the results were located deep within Google's massive index. Because it is licensed under the GNU General Public License, here is a repost. You can download the original source code here.
As a courtesy, you can copy the code to your clipboard by clicking inside the code box. Or you can download the file: gzip zip uncompressed.
- /* sprintf() for JavaScript v.0.4
- Copyright (c) 2007 Alexandru Marasteanu <http://alexei.417.ro/>
- Thanks to David Baird (unit test and patch).
- This program is free software; you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
- Foundation; either version 2 of the License, or (at your option) any later
- version.
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
- You should have received a copy of the GNU General Public License along with
- this program; if not, write to the Free Software Foundation, Inc., 59 Temple
- Place, Suite 330, Boston, MA 02111-1307 USA
- -------------------------------------------------------------------------------- */
- function sprintf () {
- var i = 0, a, f = arguments[i++], o = [], m, p, c, x;
- while (f) {
- if (m = /^[^\x25]+/.exec(f)) o.push(m[0]);
- else if (m = /^\x25{2}/.exec(f)) o.push('%');
- else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) {
- if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) { throw("Too few arguments."); }
- if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) { throw("Expecting number but found " + typeof(a)); }
- switch (m[7]) {
- case 'b': a = a.toString(2); break;
- case 'c': a = String.fromCharCode(a); break;
- case 'd': a = parseInt(a); break;
- case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break;
- case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break;
- case 'o': a = a.toString(8); break;
- case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break;
- case 'u': a = Math.abs(a); break;
- case 'x': a = a.toString(16); break;
- case 'X': a = a.toString(16).toUpperCase(); break;
- }
- a = (/[def]/.test(m[7]) && m[2] && a > 0 ? '+' + a : a);
- c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' ';
- x = m[5] - String(a).length;
- p = m[5] ? str_repeat(c, x) : '';
- o.push(m[4] ? a + p : p + a);
- }
- else throw ("Huh ?!");
- f = f.substring(m[0].length);
- }
- return o.join('');
- }
- function str_repeat(i,m) {
- for (var o = []; m > 0; o[--m] = i); return(o.join(''));
- }

