forked from sheetjs/sheetjs
		
	version bump 0.5.1: more fixes needed for xls
- Updated frac to 0.3.1 (issue with numbers exceeding 2**32) - Invalid dates render empty string - Sub-second string format - First steps towards Engineering format - Fraction formats don't render blanks in the case of zero - Trailing spaces removed - More implied tests
This commit is contained in:
		
							parent
							
								
									d31879d702
								
							
						
					
					
						commit
						c299585bfb
					
				| @ -1,13 +1,14 @@ | ||||
| { | ||||
|   "name": "ssf", | ||||
|   "version": "0.5.0", | ||||
|   "version": "0.5.1", | ||||
|   "author": "SheetJS", | ||||
|   "description": "pure-JS library to format data using ECMA-376 spreadsheet Format Codes", | ||||
|   "keywords": [ "format", "sprintf", "spreadsheet" ], | ||||
|   "main": "ssf.js", | ||||
|   "dependencies": { | ||||
|     "voc":"", | ||||
|     "colors":"" | ||||
|     "colors":"", | ||||
|     "frac":"0.3.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "mocha":"" | ||||
|  | ||||
							
								
								
									
										43
									
								
								ssf.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										43
									
								
								ssf.js
									
									
									
									
									
								
							| @ -70,9 +70,9 @@ var frac = function frac(x, D, mixed) { | ||||
|   var B = x * sgn; | ||||
|   var P_2 = 0, P_1 = 1, P = 0; | ||||
|   var Q_2 = 1, Q_1 = 0, Q = 0; | ||||
|   var A = B|0; | ||||
|   var A = Math.floor(B); | ||||
|   while(Q_1 < D) { | ||||
|     A = B|0; | ||||
|     A = Math.floor(B); | ||||
|     P = A * P_1 + P_2; | ||||
|     Q = A * Q_1 + Q_2; | ||||
|     if((B - A) < 0.0000000005) break; | ||||
| @ -83,6 +83,7 @@ var frac = function frac(x, D, mixed) { | ||||
|   if(Q > D) { Q = Q_1; P = P_1; } | ||||
|   if(Q > D) { Q = Q_2; P = P_2; } | ||||
|   if(!mixed) return [0, sgn * P, Q]; | ||||
|   if(Q==0) throw "Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2; | ||||
|   var q = Math.floor(sgn * P/Q); | ||||
|   return [q, sgn*P - q*Q, Q]; | ||||
| }; | ||||
| @ -96,13 +97,13 @@ var general_fmt = function(v) { | ||||
|     else if(V >= 0.0001 && V < 0.001) o = v.toPrecision(6); | ||||
|     else if(V >= Math.pow(10,10) && V < Math.pow(10,11)) o = v.toFixed(10).substr(0,12); | ||||
|     else if(V > Math.pow(10,-9) && V < Math.pow(10,11)) { | ||||
|       o = v.toFixed(12).replace(/(\.[0-9]*[1-9])0*$/,"$1").replace(/\.$/,"");  | ||||
|       o = v.toFixed(12).replace(/(\.[0-9]*[1-9])0*$/,"$1").replace(/\.$/,""); | ||||
|       if(o.length > 11+(v<0?1:0)) o = v.toPrecision(10); | ||||
|       if(o.length > 11+(v<0?1:0)) o = v.toExponential(5); | ||||
|     }  | ||||
|     } | ||||
|     else { | ||||
|       o = v.toFixed(11).replace(/(\.[0-9]*[1-9])0*$/,"$1"); | ||||
|       if(o.length > 11 + (v<0?1:0)) o = v.toPrecision(6);  | ||||
|       if(o.length > 11 + (v<0?1:0)) o = v.toPrecision(6); | ||||
|     } | ||||
|     o = o.replace(/(\.[0-9]*[1-9])0+e/,"$1e").replace(/\.0*e/,"e"); | ||||
|     return o.replace("e","E").replace(/\.0*$/,"").replace(/\.([0-9]*[^0])0*$/,".$1").replace(/(E[+-])([0-9])$/,"$1"+"0"+"$2"); | ||||
| @ -112,9 +113,10 @@ var general_fmt = function(v) { | ||||
| }; | ||||
| SSF._general = general_fmt; | ||||
| var parse_date_code = function parse_date_code(v,opts) { | ||||
|   var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0; | ||||
|   var date = Math.floor(v), time = Math.floor(86400 * (v - date)), dow=0; | ||||
|   var dout=[], out={D:date, T:time, u:86400*(v-date)-time}; fixopts(opts = (opts||{})); | ||||
|   if(opts.date1904) date += 1462; | ||||
|   if(date > 2958465) return null; | ||||
|   if(date === 60) {dout = [1900,2,29]; dow=3;} | ||||
|   else if(date === 0) {dout = [1900,1,0]; dow=6;} | ||||
|   else { | ||||
| @ -173,8 +175,8 @@ var write_date = function(type, fmt, val) { | ||||
|     } break; | ||||
|     case 's': switch(fmt) { /* seconds */ | ||||
|       case 's': return val.S; | ||||
|       case 'ss': return pad(val.S, 2); | ||||
|       case 'ss.0': return pad(val.S,2) + "." + Math.round(10*val.u); | ||||
|       case 'ss': return pad(Math.round(val.S+val.u), 2); | ||||
|       case 'ss.0': var o = pad(Math.round(10*(val.S+val.u)),3); return o.substr(0,2)+"." + o.substr(2); | ||||
|       default: throw 'bad second format: ' + fmt; | ||||
|     } break; | ||||
|     case 'Z': switch(fmt) { | ||||
| @ -201,8 +203,14 @@ var write_num = function(type, fmt, val) { | ||||
|   if(fmt.indexOf("E") > -1) { | ||||
|     var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; | ||||
|     if(fmt == '##0.0E+0') { | ||||
|       var ee = Number(val.toExponential(0).substr(3))%3; | ||||
|       o = (val/Math.pow(10,ee%3)).toPrecision(idx+1+(ee%3)).replace(/^([+-]?)([0-9]*)\.([0-9]*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,ee) + "." + $3.substr(ee) + "E"; }); | ||||
|       var ee = (Number(val.toExponential(0).substr(2+(val<0))))%3; | ||||
|       o = (val/Math.pow(10,ee)).toPrecision(idx+1+(3+ee)%3); | ||||
|       if(!o.match(/[Ee]/)) { | ||||
|         var fakee = (Number(val.toExponential(0).substr(2+(val<0)))); | ||||
|         if(o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
|         else throw "missing E"; | ||||
|       } | ||||
|       o = o.replace(/^([+-]?)([0-9]*)\.([0-9]*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(3+ee)%3) + "." + $3.substr(ee) + "E"; }); | ||||
|     } else o = val.toExponential(idx); | ||||
|     if(fmt.match(/E\+00$/) && o.match(/e[+-][0-9]$/)) o = o.substr(0,o.length-1) + "0" + o[o.length-1]; | ||||
|     if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| @ -226,9 +234,9 @@ var write_num = function(type, fmt, val) { | ||||
|     case "#,##0": return sign + commaify(String(Math.round(aval))); | ||||
|     case "#,##0.0": r = Math.round((val-Math.floor(val))*10); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + r; | ||||
|     case "#,##0.00": r = Math.round((val-Math.floor(val))*100); return val < 0 ? "-" + write_num(type, fmt, -val) : commaify(String(Math.floor(val))) + "." + (r < 10 ? "0"+r:r); | ||||
|     case "# ? / ?": ff = frac(aval, 9, true); return sign + (ff[0]||"") + " " + (ff[1] === 0 ? "   " : ff[1] + "/" + ff[2]); | ||||
|     case "# ?? / ??": ff = frac(aval, 99, true); return sign + (ff[0]||"") + " " + (ff[1] ? pad(ff[1],2," ") + "/" + rpad(ff[2],2," ") : "     "); | ||||
|     case "# ??? / ???": ff = frac(aval, 999, true); return sign + (ff[0]||"") + " " + (ff[1] ? pad(ff[1],3," ") + "/" + rpad(ff[2],3," ") : "       "); | ||||
|     case "# ? / ?": ff = frac(aval, 9, true); return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] === 0 ? "   " : ff[1] + "/" + ff[2]); | ||||
|     case "# ?? / ??": ff = frac(aval, 99, true); return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],2," ") + "/" + rpad(ff[2],2," ") : "     "); | ||||
|     case "# ??? / ???": ff = frac(aval, 999, true); return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],3," ") + "/" + rpad(ff[2],3," ") : "       "); | ||||
|     default: | ||||
|   } | ||||
|   throw new Error("unsupported format |" + fmt + "|"); | ||||
| @ -268,6 +276,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|       case 'm': case 'd': case 'y': case 'h': case 's': case 'e': | ||||
|         if(v < 0) return ""; | ||||
|         if(!dt) dt = parse_date_code(v, opts); | ||||
|         if(!dt) return ""; | ||||
|         o = fmt[i]; while(fmt[++i] === c) o+=c; | ||||
|         if(c === 's' && fmt[i] === '.' && fmt[i+1] === '0') { o+='.'; while(fmt[++i] === '0') o+= '0'; } | ||||
|         if(c === 'm' && lst.toLowerCase() === 'h') c = 'M'; /* m = minute */ | ||||
| @ -275,6 +284,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|         q={t:c, v:o}; out.push(q); lst = c; break; | ||||
|       case 'A': | ||||
|         if(!dt) dt = parse_date_code(v, opts); | ||||
|         if(!dt) return ""; | ||||
|         q={t:c,v:"A"}; | ||||
|         if(fmt.substr(i, 3) === "A/P") {q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} | ||||
|         else if(fmt.substr(i,5) === "AM/PM") { q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | ||||
| @ -323,17 +333,16 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|         out[i].t = 't'; break; | ||||
|       case 'n': case '(': | ||||
|         var jj = i+1; | ||||
|         while(out[jj] && ("? D".indexOf(out[jj].t) > -1 || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$' || (out[jj].v == ' ' && (out[jj+1]||{}).t == '?')))) { | ||||
|         while(out[jj] && ("?D".indexOf(out[jj].t) > -1 || (out[jj].t == " " && (out[jj+1]||{}).t === "?" ) || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$' || (out[jj].v == ' ' && (out[jj+1]||{}).t == '?')))) { | ||||
|           if(out[jj].v!==' ') out[i].v += ' ' + out[jj].v; | ||||
|           delete out[jj]; ++jj; | ||||
|         } | ||||
|         out[i].v = write_num(out[i].t, out[i].v, v); | ||||
|         out[i].t = 't'; | ||||
|         i = jj; break; | ||||
|         i = jj-1; break; | ||||
|       default: throw "unrecognized type " + out[i].t; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return out.map(function(x){return x.v;}).join(""); | ||||
| } | ||||
| SSF._eval = eval_fmt; | ||||
| @ -364,7 +373,7 @@ SSF._table = table_fmt; | ||||
| SSF.load = function(fmt, idx) { table_fmt[idx] = fmt; }; | ||||
| SSF.format = format; | ||||
| SSF.get_table = function() { return table_fmt; }; | ||||
| SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(table_fmt[i]) SSF.load(i, table_fmt[i]); }; | ||||
| SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.load(tbl[i], i); }; | ||||
| }; | ||||
| make_ssf(SSF); | ||||
| if(typeof module !== 'undefined' && typeof DO_NOT_EXPORT_SSF === 'undefined') module.exports = SSF; | ||||
|  | ||||
							
								
								
									
										69
									
								
								ssf.md
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										69
									
								
								ssf.md
									
									
									
									
									
								
							| @ -146,13 +146,13 @@ For numbers, try to display up to 11 digits of the number (the original code | ||||
|     else if(V >= 0.0001 && V < 0.001) o = v.toPrecision(6); | ||||
|     else if(V >= Math.pow(10,10) && V < Math.pow(10,11)) o = v.toFixed(10).substr(0,12); | ||||
|     else if(V > Math.pow(10,-9) && V < Math.pow(10,11)) { | ||||
|       o = v.toFixed(12).replace(/(\.[0-9]*[1-9])0*$/,"$1").replace(/\.$/,"");  | ||||
|       o = v.toFixed(12).replace(/(\.[0-9]*[1-9])0*$/,"$1").replace(/\.$/,""); | ||||
|       if(o.length > 11+(v<0?1:0)) o = v.toPrecision(10); | ||||
|       if(o.length > 11+(v<0?1:0)) o = v.toExponential(5); | ||||
|     }  | ||||
|     } | ||||
|     else { | ||||
|       o = v.toFixed(11).replace(/(\.[0-9]*[1-9])0*$/,"$1"); | ||||
|       if(o.length > 11 + (v<0?1:0)) o = v.toPrecision(6);  | ||||
|       if(o.length > 11 + (v<0?1:0)) o = v.toPrecision(6); | ||||
|     } | ||||
|     o = o.replace(/(\.[0-9]*[1-9])0+e/,"$1e").replace(/\.0*e/,"e"); | ||||
|     return o.replace("e","E").replace(/\.0*$/,"").replace(/\.([0-9]*[^0])0*$/,".$1").replace(/(E[+-])([0-9])$/,"$1"+"0"+"$2"); | ||||
| @ -262,7 +262,7 @@ portion of a 24 hour day). | ||||
| 
 | ||||
| ```js>tmp/50_date.js | ||||
| var parse_date_code = function parse_date_code(v,opts) { | ||||
|   var date = Math.floor(v), time = Math.round(86400 * (v - date)), dow=0; | ||||
|   var date = Math.floor(v), time = Math.floor(86400 * (v - date)), dow=0; | ||||
|   var dout=[], out={D:date, T:time, u:86400*(v-date)-time}; fixopts(opts = (opts||{})); | ||||
| ``` | ||||
| 
 | ||||
| @ -273,6 +273,12 @@ shifted by 1462 days. | ||||
|   if(opts.date1904) date += 1462; | ||||
| ``` | ||||
| 
 | ||||
| Date codes beyond 12/31/9999 are invalid: | ||||
| 
 | ||||
| ``` | ||||
|   if(date > 2958465) return null; | ||||
| ``` | ||||
| 
 | ||||
| Due to a bug in Lotus 1-2-3 which was propagated by Excel and other variants, | ||||
| the year 1900 is recognized as a leap year.  JS has no way of representing that | ||||
| abomination as a `Date`, so the easiest way is to store the data as a tuple. | ||||
| @ -359,8 +365,19 @@ For the special case of engineering notation, "shift" the decimal: | ||||
| 
 | ||||
| ``` | ||||
|     if(fmt == '##0.0E+0') { | ||||
|       var ee = Number(val.toExponential(0).substr(3))%3; | ||||
|       o = (val/Math.pow(10,ee%3)).toPrecision(idx+1+(ee%3)).replace(/^([+-]?)([0-9]*)\.([0-9]*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,ee) + "." + $3.substr(ee) + "E"; }); | ||||
|       var ee = (Number(val.toExponential(0).substr(2+(val<0))))%3; | ||||
|       o = (val/Math.pow(10,ee)).toPrecision(idx+1+(3+ee)%3); | ||||
|       if(!o.match(/[Ee]/)) { | ||||
| ``` | ||||
| 
 | ||||
| TODO: something reasonable | ||||
| 
 | ||||
| ``` | ||||
|         var fakee = (Number(val.toExponential(0).substr(2+(val<0)))); | ||||
|         if(o.indexOf(".") === -1) o = o[0] + "." + o.substr(1) + "E+" + (fakee - o.length+ee); | ||||
|         else throw "missing E"; | ||||
|       } | ||||
|       o = o.replace(/^([+-]?)([0-9]*)\.([0-9]*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(3+ee)%3) + "." + $3.substr(ee) + "E"; }); | ||||
|     } else o = val.toExponential(idx); | ||||
|     if(fmt.match(/E\+00$/) && o.match(/e[+-][0-9]$/)) o = o.substr(0,o.length-1) + "0" + o[o.length-1]; | ||||
|     if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e"); | ||||
| @ -404,9 +421,9 @@ The default cases are hard-coded.  TODO: actually parse them | ||||
| The frac helper function is used for fraction formats (defined below). | ||||
| 
 | ||||
| ```js>tmp/60_number.js | ||||
|     case "# ? / ?": ff = frac(aval, 9, true); return sign + (ff[0]||"") + " " + (ff[1] === 0 ? "   " : ff[1] + "/" + ff[2]); | ||||
|     case "# ?? / ??": ff = frac(aval, 99, true); return sign + (ff[0]||"") + " " + (ff[1] ? pad(ff[1],2," ") + "/" + rpad(ff[2],2," ") : "     "); | ||||
|     case "# ??? / ???": ff = frac(aval, 999, true); return sign + (ff[0]||"") + " " + (ff[1] ? pad(ff[1],3," ") + "/" + rpad(ff[2],3," ") : "       "); | ||||
|     case "# ? / ?": ff = frac(aval, 9, true); return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] === 0 ? "   " : ff[1] + "/" + ff[2]); | ||||
|     case "# ?? / ??": ff = frac(aval, 99, true); return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],2," ") + "/" + rpad(ff[2],2," ") : "     "); | ||||
|     case "# ??? / ???": ff = frac(aval, 999, true); return sign + (ff[0]||(ff[1] ? "" : "0")) + " " + (ff[1] ? pad(ff[1],3," ") + "/" + rpad(ff[2],3," ") : "       "); | ||||
|     default: | ||||
|   } | ||||
|   throw new Error("unsupported format |" + fmt + "|"); | ||||
| @ -474,6 +491,7 @@ Merge strings like "mmmmm" or "hh" into one block: | ||||
| 
 | ||||
| ``` | ||||
|         if(!dt) dt = parse_date_code(v, opts); | ||||
|         if(!dt) return ""; | ||||
|         o = fmt[i]; while(fmt[++i] === c) o+=c; | ||||
| ``` | ||||
| 
 | ||||
| @ -502,6 +520,7 @@ the HH/hh jazz.  TODO: investigate this further. | ||||
| ``` | ||||
|       case 'A': | ||||
|         if(!dt) dt = parse_date_code(v, opts); | ||||
|         if(!dt) return ""; | ||||
|         q={t:c,v:"A"}; | ||||
|         if(fmt.substr(i, 3) === "A/P") {q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} | ||||
|         else if(fmt.substr(i,5) === "AM/PM") { q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | ||||
| @ -539,7 +558,7 @@ number 123.456 under format `|??| /  |???| |???| foo` is `|15432| /  |125| |   | | ||||
|         q={t:c, v:o}; out.push(q); lst = c; break; | ||||
| ``` | ||||
| 
 | ||||
| Due to how the CSV generation works, asterisk characters are discarded.  TODO:  | ||||
| Due to how the CSV generation works, asterisk characters are discarded.  TODO: | ||||
| communicate this somehow, possibly with an option | ||||
| 
 | ||||
| ``` | ||||
| @ -591,17 +610,16 @@ The default magic characters are listed in subsubsections 18.8.30-31 of ECMA376: | ||||
|         out[i].t = 't'; break; | ||||
|       case 'n': case '(': | ||||
|         var jj = i+1; | ||||
|         while(out[jj] && ("? D".indexOf(out[jj].t) > -1 || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$' || (out[jj].v == ' ' && (out[jj+1]||{}).t == '?')))) { | ||||
|         while(out[jj] && ("?D".indexOf(out[jj].t) > -1 || (out[jj].t == " " && (out[jj+1]||{}).t === "?" ) || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$' || (out[jj].v == ' ' && (out[jj+1]||{}).t == '?')))) { | ||||
|           if(out[jj].v!==' ') out[i].v += ' ' + out[jj].v; | ||||
|           delete out[jj]; ++jj; | ||||
|         } | ||||
|         out[i].v = write_num(out[i].t, out[i].v, v); | ||||
|         out[i].t = 't'; | ||||
|         i = jj; break; | ||||
|         i = jj-1; break; | ||||
|       default: throw "unrecognized type " + out[i].t; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   return out.map(function(x){return x.v;}).join(""); | ||||
| } | ||||
| SSF._eval = eval_fmt; | ||||
| @ -655,8 +673,8 @@ var write_date = function(type, fmt, val) { | ||||
|     } break; | ||||
|     case 's': switch(fmt) { /* seconds */ | ||||
|       case 's': return val.S; | ||||
|       case 'ss': return pad(val.S, 2); | ||||
|       case 'ss.0': return pad(val.S,2) + "." + Math.round(10*val.u); | ||||
|       case 'ss': return pad(Math.round(val.S+val.u), 2); | ||||
|       case 'ss.0': var o = pad(Math.round(10*(val.S+val.u)),3); return o.substr(0,2)+"." + o.substr(2); | ||||
|       default: throw 'bad second format: ' + fmt; | ||||
|     } break; | ||||
| ``` | ||||
| @ -731,11 +749,11 @@ SSF.load = function(fmt, idx) { table_fmt[idx] = fmt; }; | ||||
| SSF.format = format; | ||||
| ``` | ||||
| 
 | ||||
| To support multiple SSF tables:   | ||||
| To support multiple SSF tables: | ||||
| 
 | ||||
| ``` | ||||
| SSF.get_table = function() { return table_fmt; }; | ||||
| SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(table_fmt[i]) SSF.load(i, table_fmt[i]); }; | ||||
| SSF.load_table = function(tbl) { for(var i=0; i!=0x0188; ++i) if(tbl[i]) SSF.load(tbl[i], i); }; | ||||
| ``` | ||||
| 
 | ||||
| ## Fraction Library | ||||
| @ -748,9 +766,9 @@ var frac = function frac(x, D, mixed) { | ||||
|   var B = x * sgn; | ||||
|   var P_2 = 0, P_1 = 1, P = 0; | ||||
|   var Q_2 = 1, Q_1 = 0, Q = 0; | ||||
|   var A = B|0; | ||||
|   var A = Math.floor(B); | ||||
|   while(Q_1 < D) { | ||||
|     A = B|0; | ||||
|     A = Math.floor(B); | ||||
|     P = A * P_1 + P_2; | ||||
|     Q = A * Q_1 + Q_2; | ||||
|     if((B - A) < 0.0000000005) break; | ||||
| @ -761,6 +779,7 @@ var frac = function frac(x, D, mixed) { | ||||
|   if(Q > D) { Q = Q_1; P = P_1; } | ||||
|   if(Q > D) { Q = Q_2; P = P_2; } | ||||
|   if(!mixed) return [0, sgn * P, Q]; | ||||
|   if(Q==0) throw "Unexpected state: "+P+" "+P_1+" "+P_2+" "+Q+" "+Q_1+" "+Q_2; | ||||
|   var q = Math.floor(sgn * P/Q); | ||||
|   return [q, sgn*P - q*Q, Q]; | ||||
| }; | ||||
| @ -818,14 +837,15 @@ test: | ||||
| ```json>package.json | ||||
| { | ||||
|   "name": "ssf", | ||||
|   "version": "0.5.0", | ||||
|   "version": "0.5.1", | ||||
|   "author": "SheetJS", | ||||
|   "description": "pure-JS library to format data using ECMA-376 spreadsheet Format Codes", | ||||
|   "keywords": [ "format", "sprintf", "spreadsheet" ], | ||||
|   "main": "ssf.js", | ||||
|   "dependencies": { | ||||
|     "voc":"", | ||||
|     "colors":"" | ||||
|     "colors":"", | ||||
|     "frac":"0.3.1" | ||||
|   }, | ||||
|   "devDependencies": { | ||||
|     "mocha":"" | ||||
| @ -859,14 +879,17 @@ before_install: | ||||
| The mocha test driver tests the implied formats: | ||||
| 
 | ||||
| ```js>test/implied.js | ||||
| /* vim: set ts=2: */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/implied.json','utf8')); | ||||
| var skip = []; | ||||
| function doit(d) { | ||||
|   d[1].forEach(function(r){if(!r[2])assert.equal(SSF.format(r[0],d[0]),r[1]);}); | ||||
| } | ||||
| describe('implied formats', function() { | ||||
|   data.forEach(function(d) { | ||||
|     it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|     if(d.length == 2) it(d[0], function() { doit(d); }); | ||||
|     else it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|       assert.equal(SSF.format(d[1], d[0], {}), d[2]); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
| @ -1,11 +1,14 @@ | ||||
| /* vim: set ts=2: */ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var data = JSON.parse(fs.readFileSync('./test/implied.json','utf8')); | ||||
| var skip = []; | ||||
| function doit(d) { | ||||
|   d[1].forEach(function(r){if(!r[2])assert.equal(SSF.format(r[0],d[0]),r[1]);}); | ||||
| } | ||||
| describe('implied formats', function() { | ||||
|   data.forEach(function(d) { | ||||
|     it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|     if(d.length == 2) it(d[0], function() { doit(d); }); | ||||
|     else it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ | ||||
|       assert.equal(SSF.format(d[1], d[0], {}), d[2]); | ||||
|     }); | ||||
|   }); | ||||
|  | ||||
| @ -1,67 +1,756 @@ | ||||
| [ | ||||
|   [12345.6789, 0, "12345.6789"], | ||||
|   [12345.6789, 1, "12346"], | ||||
|   [12345.6789, 2, "12345.68"], | ||||
|   [12345.6789, 3, "12,346"], | ||||
|   [12345.6789, 4, "12,345.68"], | ||||
|   [12345.6789, 9, "1234568%"], | ||||
|   [12345.6789, 10, "1234567.89%"], | ||||
|   [12345.6789, 11, "1.23E+04"], | ||||
|   [12345.6789, 12, "12345 2/3"], | ||||
|   [12345.6789, 13, "12345 55/81"], | ||||
|   [12345.6789, 14, "10/18/33"], | ||||
|   [12345.6789, 15, "18-Oct-33"], | ||||
|   [12345.6789, 16, "18-Oct"], | ||||
|   [12345.6789, 17, "Oct-33"], | ||||
|   [12345.6789, 18, "4:17 PM"], | ||||
|   [12345.6789, 19, "4:17:37 PM"], | ||||
|   [12345.6789, 20, "16:17"], | ||||
|   [12345.6789, 21, "16:17:37"], | ||||
|   [12345.6789, 22, "10/18/33 16:17"], | ||||
|   [12345.6789, 37, "12,346"], | ||||
|   [12345.6789, 38, "12,346"], | ||||
|   [12345.6789, 39, "12,345.68"], | ||||
|   [12345.6789, 40, "12,345.68"], | ||||
|   [12345.6789, 45, "17:37"], | ||||
|   [12345.6789, 46, "296296:17:37"], | ||||
|   [12345.6789, 47, "1737.0"], | ||||
|   [12345.6789, 48, "12.3E+3"], | ||||
|   [12345.6789, 49, "12345.6789"], | ||||
|   [1234567890000, [ | ||||
|     [0, "1.23457E+12", true], | ||||
|     [1, "1234567890000"], | ||||
|     [2, "1234567890000.00"], | ||||
|     [3, "1,234,567,890,000"], | ||||
|     [4, "1,234,567,890,000.00"], | ||||
|     [9, "123456789000000%"], | ||||
|     [10, "123456789000000.00%"], | ||||
|     [11, "1.23E+12"], | ||||
|     [12, "1234567890000    "], | ||||
|     [13, "1234567890000      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "1,234,567,890,000 "], | ||||
|     [38, "1,234,567,890,000 "], | ||||
|     [39, "1,234,567,890,000.00"], | ||||
|     [40, "1,234,567,890,000.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "1.2E+12"], | ||||
|     [49, "1.23457E+12", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [-12345.6789, 0, "-12345.6789"], | ||||
|   [-12345.6789, 1, "-12346"], | ||||
|   [-12345.6789, 2, "-12345.68"], | ||||
|   [-12345.6789, 3, "-12,346"], | ||||
|   [-12345.6789, 4, "-12,345.68"], | ||||
|   [-12345.6789, 9, "-1234568%"], | ||||
|   [-12345.6789, 10, "-1234567.89%"], | ||||
|   [-12345.6789, 11, "-1.23E+04"], | ||||
|   [-12345.6789, 12, "-12345 2/3"], | ||||
|   [-12345.6789, 13, "-12345 55/81"], | ||||
|   [-12345.6789, 14, ""], | ||||
|   [-12345.6789, 15, ""], | ||||
|   [-12345.6789, 16, ""], | ||||
|   [-12345.6789, 17, ""], | ||||
|   [-12345.6789, 18, ""], | ||||
|   [-12345.6789, 19, ""], | ||||
|   [-12345.6789, 20, ""], | ||||
|   [-12345.6789, 21, ""], | ||||
|   [-12345.6789, 22, ""], | ||||
|   [-12345.6789, 37, "(12,346)"], | ||||
|   [-12345.6789, 38, "(12,346)"], | ||||
|   [-12345.6789, 39, "(12,345.68)"], | ||||
|   [-12345.6789, 40, "(12,345.68)"], | ||||
|   [-12345.6789, 45, ""], | ||||
|   [-12345.6789, 46, ""], | ||||
|   [-12345.6789, 47, ""], | ||||
|   [-12345.6789, 48, "-12.3E+3"], | ||||
|   [-12345.6789, 49, "-12345.6789"], | ||||
|   [123456789000, [ | ||||
|     [0, "1.23457E+11"], | ||||
|     [1, "123456789000"], | ||||
|     [2, "123456789000.00"], | ||||
|     [3, "123,456,789,000"], | ||||
|     [4, "123,456,789,000.00"], | ||||
|     [9, "12345678900000%"], | ||||
|     [10, "12345678900000.00%"], | ||||
|     [11, "1.23E+11"], | ||||
|     [12, "123456789000    "], | ||||
|     [13, "123456789000      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "123,456,789,000 "], | ||||
|     [38, "123,456,789,000 "], | ||||
|     [39, "123,456,789,000.00"], | ||||
|     [40, "123,456,789,000.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "123.5E+9", true], | ||||
|     [49, "1.23457E+11", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [12345678900, [ | ||||
|     [0, "12345678900"], | ||||
|     [1, "12345678900"], | ||||
|     [2, "12345678900.00"], | ||||
|     [3, "12,345,678,900"], | ||||
|     [4, "12,345,678,900.00"], | ||||
|     [9, "1234567890000%"], | ||||
|     [10, "1234567890000.00%"], | ||||
|     [11, "1.23E+10"], | ||||
|     [12, "12345678900    "], | ||||
|     [13, "12345678900      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "12,345,678,900 "], | ||||
|     [38, "12,345,678,900 "], | ||||
|     [39, "12,345,678,900.00"], | ||||
|     [40, "12,345,678,900.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "12.3E+9"], | ||||
|     [49, "12345678900"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1234567890, [ | ||||
|     [0, "1234567890"], | ||||
|     [1, "1234567890"], | ||||
|     [2, "1234567890.00"], | ||||
|     [3, "1,234,567,890"], | ||||
|     [4, "1,234,567,890.00"], | ||||
|     [9, "123456789000%"], | ||||
|     [10, "123456789000.00%"], | ||||
|     [11, "1.23E+09"], | ||||
|     [12, "1234567890    "], | ||||
|     [13, "1234567890      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "1,234,567,890 "], | ||||
|     [38, "1,234,567,890 "], | ||||
|     [39, "1,234,567,890.00"], | ||||
|     [40, "1,234,567,890.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "1.2E+9"], | ||||
|     [49, "1234567890"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123456789, [ | ||||
|     [0, "123456789"], | ||||
|     [1, "123456789"], | ||||
|     [2, "123456789.00"], | ||||
|     [3, "123,456,789"], | ||||
|     [4, "123,456,789.00"], | ||||
|     [9, "12345678900%"], | ||||
|     [10, "12345678900.00%"], | ||||
|     [11, "1.23E+08"], | ||||
|     [12, "123456789    "], | ||||
|     [13, "123456789      "], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "123,456,789 "], | ||||
|     [38, "123,456,789 "], | ||||
|     [39, "123,456,789.00"], | ||||
|     [40, "123,456,789.00"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "123.5E+6"], | ||||
|     [49, "123456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12345678.9, [ | ||||
|     [0, "12345678.9"], | ||||
|     [1, "12345679"], | ||||
|     [2, "12345678.90"], | ||||
|     [3, "12,345,679"], | ||||
|     [4, "12,345,678.90"], | ||||
|     [9, "1234567890%"], | ||||
|     [10, "1234567890.00%"], | ||||
|     [11, "1.23E+07"], | ||||
|     [12, "12345679    "], | ||||
|     [13, "12345678  9/10"], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "12,345,679 "], | ||||
|     [38, "12,345,679 "], | ||||
|     [39, "12,345,678.90"], | ||||
|     [40, "12,345,678.90"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "12.3E+6"], | ||||
|     [49, "12345678.9"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1234567.89, [ | ||||
|     [0, "1234567.89"], | ||||
|     [1, "1234568"], | ||||
|     [2, "1234567.89"], | ||||
|     [3, "1,234,568"], | ||||
|     [4, "1,234,567.89"], | ||||
|     [9, "123456789%"], | ||||
|     [10, "123456789.00%"], | ||||
|     [11, "1.23E+06"], | ||||
|     [12, "1234567 8/9"], | ||||
|     [13, "1234567  8/9 "], | ||||
|     [14, "2/15/80"], | ||||
|     [15, "15-Feb-80"], | ||||
|     [16, "15-Feb"], | ||||
|     [17, "Feb-80"], | ||||
|     [18, "9:21 PM"], | ||||
|     [19, "9:21:36 PM"], | ||||
|     [20, "21:21"], | ||||
|     [21, "21:21:36"], | ||||
|     [22, "2/15/80 21:21"], | ||||
|     [37, "1,234,568 "], | ||||
|     [38, "1,234,568 "], | ||||
|     [39, "1,234,567.89"], | ||||
|     [40, "1,234,567.89"], | ||||
|     [45, "21:36"], | ||||
|     [46, "29629629:21:36"], | ||||
|     [47, "2136.0"], | ||||
|     [48, "1.2E+6"], | ||||
|     [49, "1234567.89"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123456.789, [ | ||||
|     [0, "123456.789"], | ||||
|     [1, "123457"], | ||||
|     [2, "123456.79"], | ||||
|     [3, "123,457"], | ||||
|     [4, "123,456.79"], | ||||
|     [9, "12345679%"], | ||||
|     [10, "12345678.90%"], | ||||
|     [11, "1.23E+05"], | ||||
|     [12, "123456 4/5"], | ||||
|     [13, "123456 15/19"], | ||||
|     [14, "1/3/38"], | ||||
|     [15, "3-Jan-38"], | ||||
|     [16, "3-Jan"], | ||||
|     [17, "Jan-38"], | ||||
|     [18, "6:56 PM"], | ||||
|     [19, "6:56:10 PM"], | ||||
|     [20, "18:56"], | ||||
|     [21, "18:56:10"], | ||||
|     [22, "1/3/38 18:56"], | ||||
|     [37, "123,457 "], | ||||
|     [38, "123,457 "], | ||||
|     [39, "123,456.79"], | ||||
|     [40, "123,456.79"], | ||||
|     [45, "56:10"], | ||||
|     [46, "2962962:56:10"], | ||||
|     [47, "5609.6"], | ||||
|     [48, "123.5E+3"], | ||||
|     [49, "123456.789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12345.6789, [ | ||||
|     [0, "12345.6789"], | ||||
|     [1, "12346"], | ||||
|     [2, "12345.68"], | ||||
|     [3, "12,346"], | ||||
|     [4, "12,345.68"], | ||||
|     [9, "1234568%"], | ||||
|     [10, "1234567.89%"], | ||||
|     [11, "1.23E+04"], | ||||
|     [12, "12345 2/3"], | ||||
|     [13, "12345 55/81"], | ||||
|     [14, "10/18/33"], | ||||
|     [15, "18-Oct-33"], | ||||
|     [16, "18-Oct"], | ||||
|     [17, "Oct-33"], | ||||
|     [18, "4:17 PM"], | ||||
|     [19, "4:17:37 PM"], | ||||
|     [20, "16:17"], | ||||
|     [21, "16:17:37"], | ||||
|     [22, "10/18/33 16:17"], | ||||
|     [37, "12,346 "], | ||||
|     [38, "12,346 "], | ||||
|     [39, "12,345.68"], | ||||
|     [40, "12,345.68"], | ||||
|     [45, "17:37"], | ||||
|     [46, "296296:17:37"], | ||||
|     [47, "1737.0"], | ||||
|     [48, "12.3E+3"], | ||||
|     [49, "12345.6789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1234.56789, [ | ||||
|     [0, "1234.56789"], | ||||
|     [1, "1235"], | ||||
|     [2, "1234.57"], | ||||
|     [3, "1,235"], | ||||
|     [4, "1,234.57"], | ||||
|     [9, "123457%"], | ||||
|     [10, "123456.79%"], | ||||
|     [11, "1.23E+03"], | ||||
|     [12, "1234 4/7"], | ||||
|     [13, "1234 46/81"], | ||||
|     [14, "5/18/03"], | ||||
|     [15, "18-May-03"], | ||||
|     [16, "18-May"], | ||||
|     [17, "May-03"], | ||||
|     [18, "1:37 PM"], | ||||
|     [19, "1:37:46 PM"], | ||||
|     [20, "13:37"], | ||||
|     [21, "13:37:46"], | ||||
|     [22, "5/18/03 13:37"], | ||||
|     [37, "1,235 "], | ||||
|     [38, "1,235 "], | ||||
|     [39, "1,234.57"], | ||||
|     [40, "1,234.57"], | ||||
|     [45, "37:46"], | ||||
|     [46, "29629:37:46"], | ||||
|     [47, "3745.7"], | ||||
|     [48, "1.2E+3"], | ||||
|     [49, "1234.56789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [123.456789, [ | ||||
|     [0, "123.456789"], | ||||
|     [1, "123"], | ||||
|     [2, "123.46"], | ||||
|     [3, "123"], | ||||
|     [4, "123.46"], | ||||
|     [9, "12346%"], | ||||
|     [10, "12345.68%"], | ||||
|     [11, "1.23E+02"], | ||||
|     [12, "123 1/2"], | ||||
|     [13, "123 37/81"], | ||||
|     [14, "5/2/00"], | ||||
|     [15, "2-May-00"], | ||||
|     [16, "2-May"], | ||||
|     [17, "May-00"], | ||||
|     [18, "10:57 AM"], | ||||
|     [19, "10:57:47 AM"], | ||||
|     [20, "10:57"], | ||||
|     [21, "10:57:47"], | ||||
|     [22, "5/2/00 10:57"], | ||||
|     [37, "123 "], | ||||
|     [38, "123 "], | ||||
|     [39, "123.46"], | ||||
|     [40, "123.46"], | ||||
|     [45, "57:47"], | ||||
|     [46, "2962:57:47"], | ||||
|     [47, "5746.6"], | ||||
|     [48, "123.5E+0", true], | ||||
|     [49, "123.456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [12.3456789, [ | ||||
|     [0, "12.3456789"], | ||||
|     [1, "12"], | ||||
|     [2, "12.35"], | ||||
|     [3, "12"], | ||||
|     [4, "12.35"], | ||||
|     [9, "1235%"], | ||||
|     [10, "1234.57%"], | ||||
|     [11, "1.23E+01"], | ||||
|     [12, "12 1/3"], | ||||
|     [13, "12 28/81"], | ||||
|     [14, "1/12/00"], | ||||
|     [15, "12-Jan-00"], | ||||
|     [16, "12-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "8:17 AM"], | ||||
|     [19, "8:17:47 AM"], | ||||
|     [20, "8:17"], | ||||
|     [21, "8:17:47"], | ||||
|     [22, "1/12/00 8:17"], | ||||
|     [37, "12 "], | ||||
|     [38, "12 "], | ||||
|     [39, "12.35"], | ||||
|     [40, "12.35"], | ||||
|     [45, "17:47"], | ||||
|     [46, "296:17:47"], | ||||
|     [47, "1746.7"], | ||||
|     [48, "12.3E+0", true], | ||||
|     [49, "12.3456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [1.23456789, [ | ||||
|     [0, "1.23456789"], | ||||
|     [1, "1"], | ||||
|     [2, "1.23"], | ||||
|     [3, "1"], | ||||
|     [4, "1.23"], | ||||
|     [9, "123%"], | ||||
|     [10, "123.46%"], | ||||
|     [11, "1.23E+00"], | ||||
|     [12, "1 1/4"], | ||||
|     [13, "1 19/81"], | ||||
|     [14, "1/1/00"], | ||||
|     [15, "1-Jan-00"], | ||||
|     [16, "1-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "5:37 AM"], | ||||
|     [19, "5:37:47 AM"], | ||||
|     [20, "5:37"], | ||||
|     [21, "5:37:47"], | ||||
|     [22, "1/1/00 5:37"], | ||||
|     [37, "1 "], | ||||
|     [38, "1 "], | ||||
|     [39, "1.23"], | ||||
|     [40, "1.23"], | ||||
|     [45, "37:47"], | ||||
|     [46, "29:37:47"], | ||||
|     [47, "3746.7"], | ||||
|     [48, "1.2E+0", true], | ||||
|     [49, "1.23456789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.123456789, [ | ||||
|     [0, "0.123456789"], | ||||
|     [1, "0"], | ||||
|     [2, "0.12"], | ||||
|     [3, "0"], | ||||
|     [4, "0.12"], | ||||
|     [9, "12%"], | ||||
|     [10, "12.35%"], | ||||
|     [11, "1.23E-01"], | ||||
|     [12, " 1/8"], | ||||
|     [13, " 10/81"], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "2:57 AM"], | ||||
|     [19, "2:57:47 AM"], | ||||
|     [20, "2:57"], | ||||
|     [21, "2:57:47"], | ||||
|     [22, "1/0/00 2:57"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.12"], | ||||
|     [40, "0.12"], | ||||
|     [45, "57:47"], | ||||
|     [46, "2:57:47"], | ||||
|     [47, "5746.7"], | ||||
|     [48, "123.5E-3", true], | ||||
|     [49, "0.123456789", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.0123456789, [ | ||||
|     [0, "0.012345679"], | ||||
|     [1, "0"], | ||||
|     [2, "0.01"], | ||||
|     [3, "0"], | ||||
|     [4, "0.01"], | ||||
|     [9, "1%"], | ||||
|     [10, "1.23%"], | ||||
|     [11, "1.23E-02"], | ||||
|     [12, "0    "], | ||||
|     [13, "  1/81"], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:17 AM"], | ||||
|     [19, "12:17:47 AM"], | ||||
|     [20, "0:17"], | ||||
|     [21, "0:17:47"], | ||||
|     [22, "1/0/00 0:17"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.01"], | ||||
|     [40, "0.01"], | ||||
|     [45, "17:47"], | ||||
|     [46, "0:17:47"], | ||||
|     [47, "1746.7"], | ||||
|     [48, "12.3E-3", true], | ||||
|     [49, "0.012345679", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.00123456789, [ | ||||
|     [0, "0.001234568"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.12%"], | ||||
|     [11, "1.23E-03"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:01 AM"], | ||||
|     [19, "12:01:47 AM"], | ||||
|     [20, "0:01"], | ||||
|     [21, "0:01:47"], | ||||
|     [22, "1/0/00 0:01"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "01:47"], | ||||
|     [46, "0:01:47"], | ||||
|     [47, "0146.7"], | ||||
|     [48, "1.2E-3", true], | ||||
|     [49, "0.001234568", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.000123456789, [ | ||||
|     [0, "0.000123457"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.01%"], | ||||
|     [11, "1.23E-04"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:11 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:11"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:11"], | ||||
|     [46, "0:00:11"], | ||||
|     [47, "0010.7"], | ||||
|     [48, "123.5E-6", true], | ||||
|     [49, "0.000123457", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.0000123456789, [ | ||||
|     [0, "1.23457E-05"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-05"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:01 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:01"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:01"], | ||||
|     [46, "0:00:01"], | ||||
|     [47, "0001.1"], | ||||
|     [48, "12.3E-6", true], | ||||
|     [49, "1.23457E-05", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.00000123456789, [ | ||||
|     [0, "1.23457E-06"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-06"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.1"], | ||||
|     [48, "1.2E-6", true], | ||||
|     [49, "1.23457E-06", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.000000123456789, [ | ||||
|     [0, "1.23457E-07"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-07"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "123.5E-9", true], | ||||
|     [49, "1.23457E-07", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.0000000123456789, [ | ||||
|     [0, "1.23457E-08"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-08"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "12.3E-9", true], | ||||
|     [49, "1.23457E-08", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.00000000123456789, [ | ||||
|     [0, "1.23457E-09"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-09"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "1.2E-9", true], | ||||
|     [49, "1.23457E-09", true] | ||||
|   ]], | ||||
| 
 | ||||
|   [0.000000000123456789, [ | ||||
|     [0, "1.23457E-10"], | ||||
|     [1, "0"], | ||||
|     [2, "0.00"], | ||||
|     [3, "0"], | ||||
|     [4, "0.00"], | ||||
|     [9, "0%"], | ||||
|     [10, "0.00%"], | ||||
|     [11, "1.23E-10"], | ||||
|     [12, "0    "], | ||||
|     [13, "0      "], | ||||
|     [14, "1/0/00"], | ||||
|     [15, "0-Jan-00"], | ||||
|     [16, "0-Jan"], | ||||
|     [17, "Jan-00"], | ||||
|     [18, "12:00 AM"], | ||||
|     [19, "12:00:00 AM"], | ||||
|     [20, "0:00"], | ||||
|     [21, "0:00:00"], | ||||
|     [22, "1/0/00 0:00"], | ||||
|     [37, "0 "], | ||||
|     [38, "0 "], | ||||
|     [39, "0.00"], | ||||
|     [40, "0.00"], | ||||
|     [45, "00:00"], | ||||
|     [46, "0:00:00"], | ||||
|     [47, "0000.0"], | ||||
|     [48, "123.5E-12", true], | ||||
|     [49, "1.23457E-10", true] | ||||
|   ]], | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   [-12345.6789, [ | ||||
|     [0, "-12345.6789"], | ||||
|     [1, "-12346"], | ||||
|     [2, "-12345.68"], | ||||
|     [3, "-12,346"], | ||||
|     [4, "-12,345.68"], | ||||
|     [9, "-1234568%"], | ||||
|     [10, "-1234567.89%"], | ||||
|     [11, "-1.23E+04"], | ||||
|     [12, "-12345 2/3"], | ||||
|     [13, "-12345 55/81"], | ||||
|     [14, ""], | ||||
|     [15, ""], | ||||
|     [16, ""], | ||||
|     [17, ""], | ||||
|     [18, ""], | ||||
|     [19, ""], | ||||
|     [20, ""], | ||||
|     [21, ""], | ||||
|     [22, ""], | ||||
|     [37, "(12,346)"], | ||||
|     [38, "(12,346)"], | ||||
|     [39, "(12,345.68)"], | ||||
|     [40, "(12,345.68)"], | ||||
|     [45, ""], | ||||
|     [46, ""], | ||||
|     [47, ""], | ||||
|     [48, "-12.3E+3"], | ||||
|     [49, "-12345.6789"] | ||||
|   ]], | ||||
| 
 | ||||
|   [11.666666666666666, 0, "11.66666667"], | ||||
|   [5.057996968497839, 0, "5.057996968"], | ||||
|   [4.380353866983808, 0, "4.380353867"], | ||||
|   [12.333333333333343, 0, "12.33333333"], | ||||
|   [-0.000006211546860868111, 0, "-6.21155E-06"], | ||||
| 
 | ||||
|   [12345.67876, 47, "1724.9"], | ||||
|   [0, 0, "0"] | ||||
| ] | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user