1 /* Copyright (c) 2005 Scott S. McCoy
2 * This was originally a non-object oriented interface
3 * Function printf(format_string,arguments...)
4 * Javascript emulation of the C printf function (modifiers and argument types
5 * "p" and "n" are not supported due to language restrictions)
7 * Copyright 2003 K&L Productions. All rights reserved
8 * http://www.klproductions.com
10 * Terms of use: This function can be used free of charge IF this header is not
11 * modified and remains with the function code.
13 * Legal: Use this code at your own risk. K&L Productions assumes NO resposibility
15 ********************************************************************************/
17 String.prototype.sprintf = function () {
18 var fstring = this.toString();
20 var pad = function(str,ch,len) { var ps='';
21 for(var i=0; i<Math.abs(len); i++) {
24 return len>0?str+ps:ps+str;
26 var processFlags = function(flags,width,rs,arg) {
27 var pn = function(flags,arg,rs) {
29 if(flags.indexOf(' ')>=0) {
31 } else if(flags.indexOf('+')>=0) {
39 var iWidth = parseInt(width,10);
40 if(width.charAt(0) == '0') {
42 if(flags.indexOf(' ')>=0 || flags.indexOf('+')>=0) {
45 if(rs.length<(iWidth-ec)) {
46 rs = pad(rs,'0',rs.length-(iWidth-ec));
48 return pn(flags,arg,rs);
50 rs = pn(flags,arg,rs);
51 if(rs.length<iWidth) {
52 if(flags.indexOf('-')<0) {
53 rs = pad(rs,' ',rs.length-iWidth);
55 rs = pad(rs,' ',iWidth - rs.length);
61 converters.c = function(flags,width,precision,arg) {
62 if (typeof(arg) == 'number') {
63 return String.fromCharCode(arg);
64 } else if (typeof(arg) == 'string') {
70 converters.d = function(flags,width,precision,arg) {
71 return converters.i(flags,width,precision,arg);
73 converters.u = function(flags,width,precision,arg) {
74 return converters.i(flags,width,precision,Math.abs(arg));
76 converters.i = function(flags,width,precision,arg) {
77 var iPrecision=parseInt(precision, 10);
78 var rs = ((Math.abs(arg)).toString().split('.'))[0];
79 if(rs.length<iPrecision) {
80 rs=pad(rs,' ',iPrecision - rs.length);
82 return processFlags(flags,width,rs,arg);
84 converters.E = function(flags,width,precision,arg) {
85 return (converters.e(flags,width,precision,arg)).toUpperCase();
87 converters.e = function(flags,width,precision,arg) {
88 iPrecision = parseInt(precision, 10);
89 if(isNaN(iPrecision)) {
92 rs = (Math.abs(arg)).toExponential(iPrecision);
93 if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
94 rs = rs.replace(/^(.*)(e.*)$/,'$1.$2');
96 return processFlags(flags,width,rs,arg);
98 converters.f = function(flags,width,precision,arg) {
99 iPrecision = parseInt(precision, 10);
100 if(isNaN(iPrecision)) {
103 rs = (Math.abs(arg)).toFixed(iPrecision);
104 if(rs.indexOf('.')<0 && flags.indexOf('#')>=0) {
107 return processFlags(flags,width,rs,arg);
109 converters.G = function(flags,width,precision,arg) {
110 return (converters.g(flags,width,precision,arg)).toUpperCase();
112 converters.g = function(flags,width,precision,arg) {
113 iPrecision = parseInt(precision, 10);
114 absArg = Math.abs(arg);
115 rse = absArg.toExponential();
116 rsf = absArg.toFixed(6);
117 if(!isNaN(iPrecision)) {
118 rsep = absArg.toExponential(iPrecision);
119 rse = rsep.length < rse.length ? rsep : rse;
120 rsfp = absArg.toFixed(iPrecision);
121 rsf = rsfp.length < rsf.length ? rsfp : rsf;
123 if(rse.indexOf('.')<0 && flags.indexOf('#')>=0) {
124 rse = rse.replace(/^(.*)(e.*)$/,'$1.$2');
126 if(rsf.indexOf('.')<0 && flags.indexOf('#')>=0) {
129 rs = rse.length<rsf.length ? rse : rsf;
130 return processFlags(flags,width,rs,arg);
132 converters.o = function(flags,width,precision,arg) {
133 var iPrecision=parseInt(precision, 10);
134 var rs = Math.round(Math.abs(arg)).toString(8);
135 if(rs.length<iPrecision) {
136 rs=pad(rs,' ',iPrecision - rs.length);
138 if(flags.indexOf('#')>=0) {
141 return processFlags(flags,width,rs,arg);
143 converters.X = function(flags,width,precision,arg) {
144 return (converters.x(flags,width,precision,arg)).toUpperCase();
146 converters.x = function(flags,width,precision,arg) {
147 var iPrecision=parseInt(precision, 10);
149 var rs = Math.round(arg).toString(16);
150 if(rs.length<iPrecision) {
151 rs=pad(rs,' ',iPrecision - rs.length);
153 if(flags.indexOf('#')>=0) {
156 return processFlags(flags,width,rs,arg);
158 converters.s = function(flags,width,precision,arg) {
159 var iPrecision=parseInt(precision, 10);
161 if(rs.length > iPrecision) {
162 rs = rs.substring(0,iPrecision);
164 return processFlags(flags,width,rs,0);
167 farr = fstring.split('%');
169 fpRE = /^([-+ #]*)(?:(\d*)\$|)(\d*)\.?(\d*)([cdieEfFgGosuxX])(.*)$/;
170 for(var i = 1; i<farr.length; i++) {
171 fps=fpRE.exec(farr[i]);
175 var my_i = fps[2] ? fps[2] : i;
176 if(arguments[my_i-1]) {
177 retstr+=converters[fps[5]](fps[1],fps[3],fps[4],arguments[my_i-1]);