1 /* Copyright (c) 2005 Scott S. McCoy
2 * This was originally a non-object oriented interface
4 /* Function printf(format_string,arguments...)
5 * Javascript emulation of the C printf function (modifiers and argument types
6 * "p" and "n" are not supported due to language restrictions)
8 * Copyright 2003 K&L Productions. All rights reserved
9 * http://www.klproductions.com
11 * Terms of use: This function can be used free of charge IF this header is not
12 * modified and remains with the function code.
14 * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
16 ********************************************************************************/
18 String.prototype.sprintf = function () {
19 var fstring = this.toString();
21 var pad = function(str,ch,len) { var ps='';
22 for(var i=0; i<Math.abs(len); i++) ps+=ch;
23 return len>0?str+ps:ps+str;
25 var processFlags = function(flags,width,rs,arg) {
26 var pn = function(flags,arg,rs) {
28 if(flags.indexOf(' ')>=0) rs = ' ' + rs;
29 else if(flags.indexOf('+')>=0) rs = '+' + rs;
35 var iWidth = parseInt(width,10);
36 if(width.charAt(0) == '0') {
38 if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) ec++;
39 if(rs.length<(iWidth-ec)) rs = pad(rs,'0',rs.length-(iWidth-ec));
40 return pn(flags,arg,rs);
42 rs = pn(flags,arg,rs);
43 if(rs.length<iWidth) {
44 if(flags.indexOf('-')<0) rs = pad(rs,' ',rs.length-iWidth);
45 else rs = pad(rs,' ',iWidth - rs.length);
49 var converters = new Array();
50 converters['c'] = function(flags,width,precision,arg) {
51 if (typeof(arg) == 'number') return String.fromCharCode(arg);
52 if (typeof(arg) == 'string') return arg.charAt(0);
55 converters['d'] = function(flags,width,precision,arg) {
56 return converters['i'](flags,width,precision,arg);
58 converters['u'] = function(flags,width,precision,arg) {
59 return converters['i'](flags,width,precision,Math.abs(arg));
61 converters['i'] = function(flags,width,precision,arg) {
62 var iPrecision=parseInt(precision);
63 var rs = ((Math.abs(arg)).toString().split('.'))[0];
64 if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
65 return processFlags(flags,width,rs,arg);
67 converters['E'] = function(flags,width,precision,arg) {
68 return (converters['e'](flags,width,precision,arg)).toUpperCase();
70 converters['e'] = function(flags,width,precision,arg) {
71 iPrecision = parseInt(precision);
72 if(isNaN(iPrecision)) iPrecision = 6;
73 rs = (Math.abs(arg)).toExponential(iPrecision);
74 if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
75 return processFlags(flags,width,rs,arg);
77 converters['f'] = function(flags,width,precision,arg) {
78 iPrecision = parseInt(precision);
79 if(isNaN(iPrecision)) iPrecision = 6;
80 rs = (Math.abs(arg)).toFixed(iPrecision);
81 if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) rs = rs + '.';
82 return processFlags(flags,width,rs,arg);
84 converters['G'] = function(flags,width,precision,arg) {
85 return (converters['g'](flags,width,precision,arg)).toUpperCase();
87 converters['g'] = function(flags,width,precision,arg) {
88 iPrecision = parseInt(precision);
89 absArg = Math.abs(arg);
90 rse = absArg.toExponential();
91 rsf = absArg.toFixed(6);
92 if(!isNaN(iPrecision)) {
93 rsep = absArg.toExponential(iPrecision);
94 rse = rsep.length < rse.length ? rsep : rse;
95 rsfp = absArg.toFixed(iPrecision);
96 rsf = rsfp.length < rsf.length ? rsfp : rsf;
98 if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
99 if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) rsf = rsf + '.';
100 rs = rse.length<rsf.length ? rse : rsf;
101 return processFlags(flags,width,rs,arg);
103 converters['o'] = function(flags,width,precision,arg) {
104 var iPrecision=parseInt(precision);
105 var rs = Math.round(Math.abs(arg)).toString(8);
106 if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
107 if(flags.indexOf('#')>=0) rs='0'+rs;
108 return processFlags(flags,width,rs,arg);
110 converters['X'] = function(flags,width,precision,arg) {
111 return (converters['x'](flags,width,precision,arg)).toUpperCase();
113 converters['x'] = function(flags,width,precision,arg) {
114 var iPrecision=parseInt(precision);
116 var rs = Math.round(arg).toString(16);
117 if(rs.length<iPrecision) rs=pad(rs,' ',iPrecision - rs.length);
118 if(flags.indexOf('#')>=0) rs='0x'+rs;
119 return processFlags(flags,width,rs,arg);
121 converters['s'] = function(flags,width,precision,arg) {
122 var iPrecision=parseInt(precision);
124 if(rs.length > iPrecision) rs = rs.substring(0,iPrecision);
125 return processFlags(flags,width,rs,0);
128 farr = fstring.split('%');
130 fpRE = /^([-+ #]*)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
131 for(var i = 1; i<farr.length; i++) {
132 fps=fpRE.exec(farr[i]);
134 if(arguments[i-1]!=null) {
135 retstr+=converters[fps[4]](fps[1],fps[2],fps[3],arguments[i-1]);