diff --git a/package.json b/package.json index 1dd238d..9fdd20b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ssf", - "version": "0.3.1", + "version": "0.4.0", "author": "SheetJS", "description": "pure-JS library to format data using ECMA-376 spreadsheet Format Codes", "keywords": [ "format", "sprintf", "spreadsheet" ], diff --git a/ssf.js b/ssf.js index 7278a26..9318276 100644 --- a/ssf.js +++ b/ssf.js @@ -4,7 +4,8 @@ var make_ssf = function(SSF){ String.prototype.reverse=function(){return this.split("").reverse().join("");}; var _strrev = function(x) { return String(x).reverse(); }; function fill(c,l) { return new Array(l+1).join(c); } -function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);} +function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);} +function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));} /* Options */ var opts_fmt = {}; function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];} @@ -64,24 +65,26 @@ var months = [ ['N', 'Nov', 'November'], ['D', 'Dec', 'December'] ]; -var frac = function(x, D, mixed) { - var n1 = Math.floor(x), d1 = 1; - var n2 = n1+1, d2 = 1; - if(x !== n1) while(d1 <= D && d2 <= D) { - var m = (n1 + n2) / (d1 + d2); - if(x === m) { - if(d1 + d2 <= D) { d1+=d2; n1+=n2; d2=D+1; } - else if(d1 > d2) d2=D+1; - else d1=D+1; - break; +var frac = function frac(x, D, mixed) { + var sgn = x < 0 ? -1 : 1; + 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; + while(Q_1 < D) { + A = B|0; + P = A * P_1 + P_2; + Q = A * Q_1 + Q_2; + if((B - A) < 0.0000000001) break; + B = 1 / (B - A); + P_2 = P_1; P_1 = P; + Q_2 = Q_1; Q_1 = Q; } - else if(x < m) { n2 = n1+n2; d2 = d1+d2; } - else { n1 = n1+n2; d1 = d1+d2; } - } - if(d1 > D) { d1 = d2; n1 = n2; } - if(!mixed) return [0, n1, d1]; - var q = Math.floor(n1/d1); - return [q, n1 - q*d1, d1]; + 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]; + var q = Math.floor(sgn * P/Q); + return [q, sgn*P - q*Q, Q]; }; var general_fmt = function(v) { if(typeof v === 'boolean') return v ? "TRUE" : "FALSE"; @@ -98,10 +101,9 @@ var general_fmt = function(v) { 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); + o = v.toFixed(11).replace(/(\.[0-9]*[1-9])0*$/,"$1"); + if(o.length > 11 + (v<0?1:0)) o = v.toPrecision(6); } - if(v==0.000000001) console.log(v, o); 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"); } @@ -208,6 +210,11 @@ var write_num = function(type, fmt, val) { } if(fmt[0] === "$") return "$"+write_num(type,fmt.substr(fmt[1]==' '?2:1),val); var r, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; + if((r = fmt.match(/# (\?+) \/ (\d+)/))) { + var den = Number(r[2]), rnd = Math.round(aval * den), base = Math.floor(rnd/den); + var myn = (rnd - base*den), myd = den; + return sign + (base?base:"") + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[2].length) : pad(myn,r[1].length," ") + "/" + pad(myd,r[2].length)); + } switch(fmt) { case "0": return Math.round(val); case "0.0": o = Math.round(val*10); @@ -219,8 +226,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(val<0?-val:val, 10, true); return (val<0?"-":"") + ff[0] + " " + ff[1] + "/" + ff[2]; - case "# ?? / ??": ff = frac(val<0?-val:val, 100, true); return (val<0?"-":"") + ff[0] + " " + ff[1] + "/" + ff[2]; + 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," ") : " "); default: } throw new Error("unsupported format |" + fmt + "|"); @@ -279,13 +287,16 @@ function eval_fmt(fmt, v, opts, flen) { break; /* Numbers */ case '0': case '#': - var nn = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) nn += c; - out.push({t:'n', v:nn}); break; + o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) o += c; + out.push({t:'n', v:o}); break; case '?': o = fmt[i]; while(fmt[++i] === c) o+=c; q={t:c, v:o}; out.push(q); lst = c; break; case '*': ++i; if(fmt[i] == ' ') ++i; break; // ** case '(': case ')': out.push({t:(flen===1?'t':c),v:c}); ++i; break; + case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + o = fmt[i]; while("0123456789".indexOf(fmt[++i]) > -1) o+=fmt[i]; + out.push({t:'D', v:o}); break; case ' ': out.push({t:c,v:c}); ++i; break; default: if("$-+/():!^&'~{}<>=".indexOf(c) === -1) @@ -312,7 +323,7 @@ function eval_fmt(fmt, v, opts, flen) { out[i].t = 't'; break; case 'n': case '(': var jj = i+1; - while(out[jj] && (out[jj].t == '?' || out[jj].t == ' ' || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$'))) { + 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 == '?')))) { if(out[jj].v!==' ') out[i].v += ' ' + out[jj].v; delete out[jj]; ++jj; } @@ -332,7 +343,7 @@ function choose_fmt(fmt, v, o) { var l = fmt.length; switch(fmt.length) { case 1: fmt = [fmt[0], fmt[0], fmt[0], "@"]; break; - case 2: fmt = [fmt[0], fmt[1], fmt[0], "@"]; break; + case 2: fmt = [fmt[0], fmt[fmt[1] === "@"?0:1], fmt[0], "@"]; break; case 4: break; default: throw "cannot find right format for |" + fmt + "|"; } @@ -343,7 +354,7 @@ function choose_fmt(fmt, v, o) { var format = function format(fmt,v,o) { fixopts(o = (o||{})); if(fmt === 0) return general_fmt(v, o); - fmt = table_fmt[fmt]; + if(typeof fmt === 'number') fmt = table_fmt[fmt]; var f = choose_fmt(fmt, v, o); return eval_fmt(f[1], v, o, f[0]); }; diff --git a/ssf.md b/ssf.md index f5710d9..bc654da 100644 --- a/ssf.md +++ b/ssf.md @@ -151,10 +151,9 @@ For numbers, try to display up to 11 digits of the number (the original code 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(v==0.000000001) console.log(v, o); + o = v.toFixed(11).replace(/(\.[0-9]*[1-9])0*$/,"$1"); + 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"); } @@ -353,13 +352,13 @@ For exponents, get the exponent and mantissa and format them separately: ``` if(fmt.indexOf("E") > -1) { - var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; + var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1; ``` For the special case of engineering notation, "shift" the decimal: ``` - if(fmt == '##0.0E+0') { + 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"; }); } else o = val.toExponential(idx); @@ -375,10 +374,20 @@ TODO: localize the currency: if(fmt[0] === "$") return "$"+write_num(type,fmt.substr(fmt[1]==' '?2:1),val); ``` -The default cases are hard-coded. TODO: actually parse them +Fractions with known denominator are resolved by rounding: ```js>tmp/number.js var r, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; + if((r = fmt.match(/# (\?+) \/ (\d+)/))) { + var den = Number(r[2]), rnd = Math.round(aval * den), base = Math.floor(rnd/den); + var myn = (rnd - base*den), myd = den; + return sign + (base?base:"") + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[2].length) : pad(myn,r[1].length," ") + "/" + pad(myd,r[2].length)); + } +``` + +The default cases are hard-coded. TODO: actually parse them + +```js>tmp/number.js switch(fmt) { case "0": return Math.round(val); case "0.0": o = Math.round(val*10); @@ -395,8 +404,9 @@ The default cases are hard-coded. TODO: actually parse them The frac helper function is used for fraction formats (defined below). ```js>tmp/number.js - case "# ? / ?": ff = frac(val<0?-val:val, 10, true); return (val<0?"-":"") + ff[0] + " " + ff[1] + "/" + ff[2]; - case "# ?? / ??": ff = frac(val<0?-val:val, 100, true); return (val<0?"-":"") + ff[0] + " " + ff[1] + "/" + ff[2]; + 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," ") : " "); default: } throw new Error("unsupported format |" + fmt + "|"); @@ -512,8 +522,8 @@ Number blocks (following the general pattern `[0#?][0#?.,E+-%]*`) are grouped to ``` /* Numbers */ case '0': case '#': - var nn = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) nn += c; - out.push({t:'n', v:nn}); break; + o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) o += c; + out.push({t:'n', v:o}); break; ``` @@ -540,8 +550,17 @@ The open and close parens `()` also has special meaning (for negative numbers): case '(': case ')': out.push({t:(flen===1?'t':c),v:c}); ++i; break; ``` +The nonzero digits show up in fraction denominators: + +``` + case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + o = fmt[i]; while("0123456789".indexOf(fmt[++i]) > -1) o+=fmt[i]; + out.push({t:'D', v:o}); break; +``` + The default magic characters are listed in subsubsections 18.8.30-31 of ECMA376: + ``` case ' ': out.push({t:c,v:c}); ++i; break; default: @@ -569,7 +588,7 @@ 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] && (out[jj].t == '?' || out[jj].t == ' ' || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$'))) { + 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 == '?')))) { if(out[jj].v!==' ') out[i].v += ' ' + out[jj].v; delete out[jj]; ++jj; } @@ -670,7 +689,7 @@ function choose_fmt(fmt, v, o) { var l = fmt.length; switch(fmt.length) { case 1: fmt = [fmt[0], fmt[0], fmt[0], "@"]; break; - case 2: fmt = [fmt[0], fmt[1], fmt[0], "@"]; break; + case 2: fmt = [fmt[0], fmt[fmt[1] === "@"?0:1], fmt[0], "@"]; break; case 4: break; default: throw "cannot find right format for |" + fmt + "|"; } @@ -681,7 +700,7 @@ function choose_fmt(fmt, v, o) { var format = function format(fmt,v,o) { fixopts(o = (o||{})); if(fmt === 0) return general_fmt(v, o); - fmt = table_fmt[fmt]; + if(typeof fmt === 'number') fmt = table_fmt[fmt]; var f = choose_fmt(fmt, v, o); return eval_fmt(f[1], v, o, f[0]); }; @@ -705,24 +724,26 @@ SSF.format = format; The implementation is from [our frac library](https://github.com/SheetJS/frac/): ```js>tmp/frac.js -var frac = function(x, D, mixed) { - var n1 = Math.floor(x), d1 = 1; - var n2 = n1+1, d2 = 1; - if(x !== n1) while(d1 <= D && d2 <= D) { - var m = (n1 + n2) / (d1 + d2); - if(x === m) { - if(d1 + d2 <= D) { d1+=d2; n1+=n2; d2=D+1; } - else if(d1 > d2) d2=D+1; - else d1=D+1; - break; +var frac = function frac(x, D, mixed) { + var sgn = x < 0 ? -1 : 1; + 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; + while(Q_1 < D) { + A = B|0; + P = A * P_1 + P_2; + Q = A * Q_1 + Q_2; + if((B - A) < 0.0000000001) break; + B = 1 / (B - A); + P_2 = P_1; P_1 = P; + Q_2 = Q_1; Q_1 = Q; } - else if(x < m) { n2 = n1+n2; d2 = d1+d2; } - else { n1 = n1+n2; d1 = d1+d2; } - } - if(d1 > D) { d1 = d2; n1 = n2; } - if(!mixed) return [0, n1, d1]; - var q = Math.floor(n1/d1); - return [q, n1 - q*d1, d1]; + 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]; + var q = Math.floor(sgn * P/Q); + return [q, sgn*P - q*Q, Q]; }; ``` @@ -735,7 +756,8 @@ var make_ssf = function(SSF){ String.prototype.reverse=function(){return this.split("").reverse().join("");}; var _strrev = function(x) { return String(x).reverse(); }; function fill(c,l) { return new Array(l+1).join(c); } -function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);} +function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);} +function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));} ``` ```js>tmp/zz_footer_n.js @@ -755,6 +777,7 @@ make_ssf(SSF); npm install cat tmp/{00_header,opts,consts,frac,general,date,number,main,zz_footer_n}.js > ssf_node.js cat tmp/{00_header,opts,consts,frac,general,date,number,main,zz_footer}.js > ssf.js + ``` ```json>.vocrc @@ -782,7 +805,7 @@ test: ```json>package.json { "name": "ssf", - "version": "0.3.1", + "version": "0.4.0", "author": "SheetJS", "description": "pure-JS library to format data using ECMA-376 spreadsheet Format Codes", "keywords": [ "format", "sprintf", "spreadsheet" ], @@ -834,6 +857,42 @@ describe('implied formats', function() { }); ``` +The general test driver tests the General format: + +```js>test/general.js +/* vim: set ts=2: */ +var SSF = require('../'); +var fs = require('fs'), assert = require('assert'); +var data = JSON.parse(fs.readFileSync('./test/general.json','utf8')); +var skip = []; +describe('General format', function() { + data.forEach(function(d) { + it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ + assert.equal(SSF.format(d[1], d[0], {}), d[2]); + }); + }); +}); +``` + +The fraction test driver tests fractional formats: + +```js>test/fraction.js +/* vim: set ts=2: */ +var SSF = require('../'); +var fs = require('fs'), assert = require('assert'); +var data = JSON.parse(fs.readFileSync('./test/fraction.json','utf8')); +var skip = []; +describe('fractional formats', function() { + data.forEach(function(d) { + it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ + var expected = d[2], actual = SSF.format(d[1], d[0], {}) + //var r = actual.match(/(-?)\d* *\d+\/\d+/); + assert.equal(actual, expected); + }); + }); +}); +``` + The old test driver was manual: ```js>tmp/test.njs diff --git a/ssf_node.js b/ssf_node.js index fdbd004..0c39d99 100644 --- a/ssf_node.js +++ b/ssf_node.js @@ -4,7 +4,8 @@ var make_ssf = function(SSF){ String.prototype.reverse=function(){return this.split("").reverse().join("");}; var _strrev = function(x) { return String(x).reverse(); }; function fill(c,l) { return new Array(l+1).join(c); } -function pad(v,d){var t=String(v);return t.length>=d?t:(fill(0,d-t.length)+t);} +function pad(v,d,c){var t=String(v);return t.length>=d?t:(fill(c||0,d-t.length)+t);} +function rpad(v,d,c){var t=String(v);return t.length>=d?t:(t+fill(c||0,d-t.length));} /* Options */ var opts_fmt = {}; function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];} @@ -64,24 +65,26 @@ var months = [ ['N', 'Nov', 'November'], ['D', 'Dec', 'December'] ]; -var frac = function(x, D, mixed) { - var n1 = Math.floor(x), d1 = 1; - var n2 = n1+1, d2 = 1; - if(x !== n1) while(d1 <= D && d2 <= D) { - var m = (n1 + n2) / (d1 + d2); - if(x === m) { - if(d1 + d2 <= D) { d1+=d2; n1+=n2; d2=D+1; } - else if(d1 > d2) d2=D+1; - else d1=D+1; - break; +var frac = function frac(x, D, mixed) { + var sgn = x < 0 ? -1 : 1; + 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; + while(Q_1 < D) { + A = B|0; + P = A * P_1 + P_2; + Q = A * Q_1 + Q_2; + if((B - A) < 0.0000000001) break; + B = 1 / (B - A); + P_2 = P_1; P_1 = P; + Q_2 = Q_1; Q_1 = Q; } - else if(x < m) { n2 = n1+n2; d2 = d1+d2; } - else { n1 = n1+n2; d1 = d1+d2; } - } - if(d1 > D) { d1 = d2; n1 = n2; } - if(!mixed) return [0, n1, d1]; - var q = Math.floor(n1/d1); - return [q, n1 - q*d1, d1]; + 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]; + var q = Math.floor(sgn * P/Q); + return [q, sgn*P - q*Q, Q]; }; var general_fmt = function(v) { if(typeof v === 'boolean') return v ? "TRUE" : "FALSE"; @@ -98,10 +101,9 @@ var general_fmt = function(v) { 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); + o = v.toFixed(11).replace(/(\.[0-9]*[1-9])0*$/,"$1"); + if(o.length > 11 + (v<0?1:0)) o = v.toPrecision(6); } - if(v==0.000000001) console.log(v, o); 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"); } @@ -208,6 +210,11 @@ var write_num = function(type, fmt, val) { } if(fmt[0] === "$") return "$"+write_num(type,fmt.substr(fmt[1]==' '?2:1),val); var r, ff, aval = val < 0 ? -val : val, sign = val < 0 ? "-" : ""; + if((r = fmt.match(/# (\?+) \/ (\d+)/))) { + var den = Number(r[2]), rnd = Math.round(aval * den), base = Math.floor(rnd/den); + var myn = (rnd - base*den), myd = den; + return sign + (base?base:"") + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[2].length) : pad(myn,r[1].length," ") + "/" + pad(myd,r[2].length)); + } switch(fmt) { case "0": return Math.round(val); case "0.0": o = Math.round(val*10); @@ -219,8 +226,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(val<0?-val:val, 10, true); return (val<0?"-":"") + ff[0] + " " + ff[1] + "/" + ff[2]; - case "# ?? / ??": ff = frac(val<0?-val:val, 100, true); return (val<0?"-":"") + ff[0] + " " + ff[1] + "/" + ff[2]; + 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," ") : " "); default: } throw new Error("unsupported format |" + fmt + "|"); @@ -279,13 +287,16 @@ function eval_fmt(fmt, v, opts, flen) { break; /* Numbers */ case '0': case '#': - var nn = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) nn += c; - out.push({t:'n', v:nn}); break; + o = c; while("0#?.,E+-%".indexOf(c=fmt[++i]) > -1) o += c; + out.push({t:'n', v:o}); break; case '?': o = fmt[i]; while(fmt[++i] === c) o+=c; q={t:c, v:o}; out.push(q); lst = c; break; case '*': ++i; if(fmt[i] == ' ') ++i; break; // ** case '(': case ')': out.push({t:(flen===1?'t':c),v:c}); ++i; break; + case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': + o = fmt[i]; while("0123456789".indexOf(fmt[++i]) > -1) o+=fmt[i]; + out.push({t:'D', v:o}); break; case ' ': out.push({t:c,v:c}); ++i; break; default: if("$-+/():!^&'~{}<>=".indexOf(c) === -1) @@ -312,7 +323,7 @@ function eval_fmt(fmt, v, opts, flen) { out[i].t = 't'; break; case 'n': case '(': var jj = i+1; - while(out[jj] && (out[jj].t == '?' || out[jj].t == ' ' || out[i].t == '(' && (out[jj].t == ')' || out[jj].t == 'n') || out[jj].t == 't' && (out[jj].v == '/' || out[jj].v == '$'))) { + 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 == '?')))) { if(out[jj].v!==' ') out[i].v += ' ' + out[jj].v; delete out[jj]; ++jj; } @@ -332,7 +343,7 @@ function choose_fmt(fmt, v, o) { var l = fmt.length; switch(fmt.length) { case 1: fmt = [fmt[0], fmt[0], fmt[0], "@"]; break; - case 2: fmt = [fmt[0], fmt[1], fmt[0], "@"]; break; + case 2: fmt = [fmt[0], fmt[fmt[1] === "@"?0:1], fmt[0], "@"]; break; case 4: break; default: throw "cannot find right format for |" + fmt + "|"; } @@ -343,7 +354,7 @@ function choose_fmt(fmt, v, o) { var format = function format(fmt,v,o) { fixopts(o = (o||{})); if(fmt === 0) return general_fmt(v, o); - fmt = table_fmt[fmt]; + if(typeof fmt === 'number') fmt = table_fmt[fmt]; var f = choose_fmt(fmt, v, o); return eval_fmt(f[1], v, o, f[0]); }; diff --git a/test/fraction.js b/test/fraction.js new file mode 100644 index 0000000..8df4dd5 --- /dev/null +++ b/test/fraction.js @@ -0,0 +1,14 @@ +/* vim: set ts=2: */ +var SSF = require('../'); +var fs = require('fs'), assert = require('assert'); +var data = JSON.parse(fs.readFileSync('./test/fraction.json','utf8')); +var skip = []; +describe('fractional formats', function() { + data.forEach(function(d) { + it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ + var expected = d[2], actual = SSF.format(d[1], d[0], {}) + //var r = actual.match(/(-?)\d* *\d+\/\d+/); + assert.equal(actual, expected); + }); + }); +}); diff --git a/test/fraction.json b/test/fraction.json new file mode 100644 index 0000000..d48da3e --- /dev/null +++ b/test/fraction.json @@ -0,0 +1,107 @@ +[ + [1, "# ?/?", "1 "], + [-1.2, "# ?/?", "-1 1/5"], + [12.3, "# ?/?", "12 1/3"], + [-12.34, "# ?/?", "-12 1/3"], + [123.45, "# ?/?", "123 4/9"], + [-123.456, "# ?/?", "-123 1/2"], + [1234.567, "# ?/?", "1234 4/7"], + [-1234.5678, "# ?/?", "-1234 4/7"], + [12345.6789, "# ?/?", "12345 2/3"], + [-12345.67891, "# ?/?", "-12345 2/3"], + + [1, "# ??/??", "1 "], + [-1.2, "# ??/??", "-1 1/5 "], + [12.3, "# ??/??", "12 3/10"], + [-12.34, "# ??/??", "-12 17/50"], + [123.45, "# ??/??", "123 9/20"], + [-123.456, "# ??/??", "-123 26/57"], + [1234.567, "# ??/??", "1234 55/97"], + [-1234.5678, "# ??/??", "-1234 46/81"], + [12345.6789, "# ??/??", "12345 55/81"], + [-12345.67891, "# ??/??", "-12345 55/81"], + + [1, "# ???/???", "1 "], + [-1.2, "# ???/???", "-1 1/5 "], + [12.3, "# ???/???", "12 3/10 "], + [-12.34, "# ???/???", "-12 17/50 "], + [123.45, "# ???/???", "123 9/20 "], + [-123.456, "# ???/???", "-123 57/125"], + [1234.567, "# ???/???", "1234 55/97 "], + [-1234.5678, "# ???/???", "-1234 67/118"], + [12345.6789, "# ???/???", "12345 74/109"], + [-12345.67891, "# ???/???", "-12345 573/844"], + + + [1, "# ?/2", "1 "], + [-1.2, "# ?/2", "-1 "], + [12.3, "# ?/2", "12 1/2"], + [-12.34, "# ?/2", "-12 1/2"], + [123.45, "# ?/2", "123 1/2"], + [-123.456, "# ?/2", "-123 1/2"], + [1234.567, "# ?/2", "1234 1/2"], + [-1234.5678, "# ?/2", "-1234 1/2"], + [12345.6789, "# ?/2", "12345 1/2"], + [-12345.67891, "# ?/2", "-12345 1/2"], + + [1, "# ?/4", "1 "], + [-1.2, "# ?/4", "-1 1/4"], + [12.3, "# ?/4", "12 1/4"], + [-12.34, "# ?/4", "-12 1/4"], + [123.45, "# ?/4", "123 2/4"], + [-123.456, "# ?/4", "-123 2/4"], + [1234.567, "# ?/4", "1234 2/4"], + [-1234.5678, "# ?/4", "-1234 2/4"], + [12345.6789, "# ?/4", "12345 3/4"], + [-12345.67891, "# ?/4", "-12345 3/4"], + + [1, "# ?/8", "1 "], + [-1.2, "# ?/8", "-1 2/8"], + [12.3, "# ?/8", "12 2/8"], + [-12.34, "# ?/8", "-12 3/8"], + [123.45, "# ?/8", "123 4/8"], + [-123.456, "# ?/8", "-123 4/8"], + [1234.567, "# ?/8", "1234 5/8"], + [-1234.5678, "# ?/8", "-1234 5/8"], + [12345.6789, "# ?/8", "12345 5/8"], + [-12345.67891, "# ?/8", "-12345 5/8"], + + [1, "# ??/16", "1 "], + [-1.2, "# ??/16", "-1 3/16"], + [12.3, "# ??/16", "12 5/16"], + [-12.34, "# ??/16", "-12 5/16"], + [123.45, "# ??/16", "123 7/16"], + [-123.456, "# ??/16", "-123 7/16"], + [1234.567, "# ??/16", "1234 9/16"], + [-1234.5678, "# ??/16", "-1234 9/16"], + [12345.6789, "# ??/16", "12345 11/16"], + [-12345.67891, "# ??/16", "-12345 11/16"], + + [1, "# ?/10", "1 "], + [-1.2, "# ?/10", "-1 2/10"], + [12.3, "# ?/10", "12 3/10"], + [-12.34, "# ?/10", "-12 3/10"], + [123.45, "# ?/10", "123 5/10"], + [-123.456, "# ?/10", "-123 5/10"], + [1234.567, "# ?/10", "1234 6/10"], + [-1234.5678, "# ?/10", "-1234 6/10"], + [12345.6789, "# ?/10", "12345 7/10"], + [-12345.67891, "# ?/10", "-12345 7/10"], + + [1, "# ??/100", "1 "], + [-1.2, "# ??/100", "-1 20/100"], + [12.3, "# ??/100", "12 30/100"], + [-12.34, "# ??/100", "-12 34/100"], + [123.45, "# ??/100", "123 45/100"], + [-123.456, "# ??/100", "-123 46/100"], + [1234.567, "# ??/100", "1234 57/100"], + [-1234.5678, "# ??/100", "-1234 57/100"], + [12345.6789, "# ??/100", "12345 68/100"], + [-12345.67891, "# ??/100", "-12345 68/100"], + + [0.3, "# ?/?", " 2/7"], + [1.3, "# ?/?", "1 1/3"], + [2.3, "# ?/?", "2 2/7"], + + [0, "0", "0"] +] diff --git a/test/general.js b/test/general.js new file mode 100644 index 0000000..633526e --- /dev/null +++ b/test/general.js @@ -0,0 +1,12 @@ +/* vim: set ts=2: */ +var SSF = require('../'); +var fs = require('fs'), assert = require('assert'); +var data = JSON.parse(fs.readFileSync('./test/general.json','utf8')); +var skip = []; +describe('General format', function() { + data.forEach(function(d) { + it(d[1]+" for "+d[0], skip.indexOf(d[1]) > -1 ? null : function(){ + assert.equal(SSF.format(d[1], d[0], {}), d[2]); + }); + }); +}); diff --git a/test/general.json b/test/general.json new file mode 100644 index 0000000..e7794b7 --- /dev/null +++ b/test/general.json @@ -0,0 +1,516 @@ +[ + [1.234567E-14, 0, "1.23457E-14"], + [1.234567E-13, 0, "1.23457E-13"], + [1.234567E-12, 0, "1.23457E-12"], + [1.234567E-11, 0, "1.23457E-11"], + [1.234567E-10, 0, "1.23457E-10"], + [1.234567E-9, 0, "1.23457E-09"], + [1.234567E-8, 0, "1.23457E-08"], + [1.234567E-7, 0, "1.23457E-07"], + [1.234567E-6, 0, "1.23457E-06"], + [1.234567E-5, 0, "1.23457E-05"], + [1.234567E-4, 0, "0.000123457"], + [1.234567E-3, 0, "0.001234567"], + [1.234567E-2, 0, "0.01234567"], + [1.234567E-1, 0, "0.1234567"], + [1.234567E0, 0, "1.234567"], + [1.234567E1, 0, "12.34567"], + [1.234567E2, 0, "123.4567"], + [1.234567E3, 0, "1234.567"], + [1.234567E4, 0, "12345.67"], + [1.234567E5, 0, "123456.7"], + [1.234567E6, 0, "1234567"], + [1.234567E7, 0, "12345670"], + [1.234567E8, 0, "123456700"], + [1.234567E9, 0, "1234567000"], + [1.234567E10, 0, "12345670000"], + [1.234567E11, 0, "1.23457E+11"], + [1.234567E12, 0, "1.23457E+12"], + [1.234567E13, 0, "1.23457E+13"], + [1.234567E14, 0, "1.23457E+14"], + + [0.00000000000001, 0, "1E-14"], + [0.0000000000001, 0, "1E-13"], + [0.000000000001, 0, "1E-12"], + [0.00000000001, 0, "1E-11"], + [0.0000000001, 0, "1E-10"], + [0.000000001, 0, "0.000000001"], + [0.00000001, 0, "0.00000001"], + [0.0000001, 0, "0.0000001"], + [0.000001, 0, "0.000001"], + [0.00001, 0, "0.00001"], + [0.0001, 0, "0.0001"], + [0.001, 0, "0.001"], + [0.01, 0, "0.01"], + [0.1, 0, "0.1"], + [1, 0, "1"], + [10, 0, "10"], + [100, 0, "100"], + [1000, 0, "1000"], + [10000, 0, "10000"], + [100000, 0, "100000"], + [1000000, 0, "1000000"], + [10000000, 0, "10000000"], + [100000000, 0, "100000000"], + [1000000000, 0, "1000000000"], + [10000000000, 0, "10000000000"], + [100000000000, 0, "1E+11"], + [1000000000000, 0, "1E+12"], + [10000000000000, 0, "1E+13"], + [100000000000000, 0, "1E+14"], + + [0.000000000000012, 0, "1.2E-14"], + [0.00000000000012, 0, "1.2E-13"], + [0.0000000000012, 0, "1.2E-12"], + [0.000000000012, 0, "1.2E-11"], + [0.00000000012, 0, "1.2E-10"], + [0.0000000012, 0, "1.2E-09"], + [0.000000012, 0, "0.000000012"], + [0.00000012, 0, "0.00000012"], + [0.0000012, 0, "0.0000012"], + [0.000012, 0, "0.000012"], + [0.00012, 0, "0.00012"], + [0.0012, 0, "0.0012"], + [0.012, 0, "0.012"], + [0.12, 0, "0.12"], + [1.2, 0, "1.2"], + [12, 0, "12"], + [120, 0, "120"], + [1200, 0, "1200"], + [12000, 0, "12000"], + [120000, 0, "120000"], + [1200000, 0, "1200000"], + [12000000, 0, "12000000"], + [120000000, 0, "120000000"], + [1200000000, 0, "1200000000"], + [12000000000, 0, "12000000000"], + [120000000000, 0, "1.2E+11"], + [1200000000000, 0, "1.2E+12"], + [12000000000000, 0, "1.2E+13"], + [120000000000000, 0, "1.2E+14"], + + [0.0000000000000123, 0, "1.23E-14"], + [0.000000000000123, 0, "1.23E-13"], + [0.00000000000123, 0, "1.23E-12"], + [0.0000000000123, 0, "1.23E-11"], + [0.000000000123, 0, "1.23E-10"], + [0.00000000123, 0, "1.23E-09"], + [0.0000000123, 0, "1.23E-08"], + [0.000000123, 0, "0.000000123"], + [0.00000123, 0, "0.00000123"], + [0.0000123, 0, "0.0000123"], + [0.000123, 0, "0.000123"], + [0.00123, 0, "0.00123"], + [0.0123, 0, "0.0123"], + [0.123, 0, "0.123"], + [1.23, 0, "1.23"], + [12.3, 0, "12.3"], + [123, 0, "123"], + [1230, 0, "1230"], + [12300, 0, "12300"], + [123000, 0, "123000"], + [1230000, 0, "1230000"], + [12300000, 0, "12300000"], + [123000000, 0, "123000000"], + [1230000000, 0, "1230000000"], + [12300000000, 0, "12300000000"], + [123000000000, 0, "1.23E+11"], + [1230000000000, 0, "1.23E+12"], + [12300000000000, 0, "1.23E+13"], + [123000000000000, 0, "1.23E+14"], + + [0.00000000000001234, 0, "1.234E-14"], + [0.0000000000001234, 0, "1.234E-13"], + [0.000000000001234, 0, "1.234E-12"], + [0.00000000001234, 0, "1.234E-11"], + [0.0000000001234, 0, "1.234E-10"], + [0.000000001234, 0, "1.234E-09"], + [0.00000001234, 0, "1.234E-08"], + [0.0000001234, 0, "1.234E-07"], + [0.000001234, 0, "0.000001234"], + [0.00001234, 0, "0.00001234"], + [0.0001234, 0, "0.0001234"], + [0.001234, 0, "0.001234"], + [0.01234, 0, "0.01234"], + [0.1234, 0, "0.1234"], + [1.234, 0, "1.234"], + [12.34, 0, "12.34"], + [123.4, 0, "123.4"], + [1234, 0, "1234"], + [12340, 0, "12340"], + [123400, 0, "123400"], + [1234000, 0, "1234000"], + [12340000, 0, "12340000"], + [123400000, 0, "123400000"], + [1234000000, 0, "1234000000"], + [12340000000, 0, "12340000000"], + [123400000000, 0, "1.234E+11"], + [1234000000000, 0, "1.234E+12"], + [12340000000000, 0, "1.234E+13"], + [123400000000000, 0, "1.234E+14"], + + [0.000000000000012345, 0, "1.2345E-14"], + [0.00000000000012345, 0, "1.2345E-13"], + [0.0000000000012345, 0, "1.2345E-12"], + [0.000000000012345, 0, "1.2345E-11"], + [0.00000000012345, 0, "1.2345E-10"], + [0.0000000012345, 0, "1.2345E-09"], + [0.000000012345, 0, "1.2345E-08"], + [0.00000012345, 0, "1.2345E-07"], + [0.0000012345, 0, "1.2345E-06"], + [0.000012345, 0, "0.000012345"], + [0.00012345, 0, "0.00012345"], + [0.0012345, 0, "0.0012345"], + [0.012345, 0, "0.012345"], + [0.12345, 0, "0.12345"], + [1.2345, 0, "1.2345"], + [12.345, 0, "12.345"], + [123.45, 0, "123.45"], + [1234.5, 0, "1234.5"], + [12345, 0, "12345"], + [123450, 0, "123450"], + [1234500, 0, "1234500"], + [12345000, 0, "12345000"], + [123450000, 0, "123450000"], + [1234500000, 0, "1234500000"], + [12345000000, 0, "12345000000"], + [123450000000, 0, "1.2345E+11"], + [1234500000000, 0, "1.2345E+12"], + [12345000000000, 0, "1.2345E+13"], + [123450000000000, 0, "1.2345E+14"], + + [0.0000000000000123456, 0, "1.23456E-14"], + [0.000000000000123456, 0, "1.23456E-13"], + [0.00000000000123456, 0, "1.23456E-12"], + [0.0000000000123456, 0, "1.23456E-11"], + [0.000000000123456, 0, "1.23456E-10"], + [0.00000000123456, 0, "1.23456E-09"], + [0.0000000123456, 0, "1.23456E-08"], + [0.000000123456, 0, "1.23456E-07"], + [0.00000123456, 0, "1.23456E-06"], + [0.0000123456, 0, "1.23456E-05"], + [0.000123456, 0, "0.000123456"], + [0.00123456, 0, "0.00123456"], + [0.0123456, 0, "0.0123456"], + [0.123456, 0, "0.123456"], + [1.23456, 0, "1.23456"], + [12.3456, 0, "12.3456"], + [123.456, 0, "123.456"], + [1234.56, 0, "1234.56"], + [12345.6, 0, "12345.6"], + [123456, 0, "123456"], + [1234560, 0, "1234560"], + [12345600, 0, "12345600"], + [123456000, 0, "123456000"], + [1234560000, 0, "1234560000"], + [12345600000, 0, "12345600000"], + [123456000000, 0, "1.23456E+11"], + [1234560000000, 0, "1.23456E+12"], + [12345600000000, 0, "1.23456E+13"], + [123456000000000, 0, "1.23456E+14"], + + [0.00000000000001234567, 0, "1.23457E-14"], + [0.0000000000001234567, 0, "1.23457E-13"], + [0.000000000001234567, 0, "1.23457E-12"], + [0.00000000001234567, 0, "1.23457E-11"], + [0.0000000001234567, 0, "1.23457E-10"], + [0.000000001234567, 0, "1.23457E-09"], + [0.00000001234567, 0, "1.23457E-08"], + [0.0000001234567, 0, "1.23457E-07"], + [0.000001234567, 0, "1.23457E-06"], + [0.00001234567, 0, "1.23457E-05"], + [0.0001234567, 0, "0.000123457"], + [0.001234567, 0, "0.001234567"], + [0.01234567, 0, "0.01234567"], + [0.1234567, 0, "0.1234567"], + [1.234567, 0, "1.234567"], + [12.34567, 0, "12.34567"], + [123.4567, 0, "123.4567"], + [1234.567, 0, "1234.567"], + [12345.67, 0, "12345.67"], + [123456.7, 0, "123456.7"], + [1234567, 0, "1234567"], + [12345670, 0, "12345670"], + [123456700, 0, "123456700"], + [1234567000, 0, "1234567000"], + [12345670000, 0, "12345670000"], + [123456700000, 0, "1.23457E+11"], + [1234567000000, 0, "1.23457E+12"], + [12345670000000, 0, "1.23457E+13"], + [123456700000000, 0, "1.23457E+14"], + + [0.000000000000012345678, 0, "1.23457E-14"], + [0.00000000000012345678, 0, "1.23457E-13"], + [0.0000000000012345678, 0, "1.23457E-12"], + [0.000000000012345678, 0, "1.23457E-11"], + [0.00000000012345678, 0, "1.23457E-10"], + [0.0000000012345678, 0, "1.23457E-09"], + [0.000000012345678, 0, "1.23457E-08"], + [0.00000012345678, 0, "1.23457E-07"], + [0.0000012345678, 0, "1.23457E-06"], + [0.000012345678, 0, "1.23457E-05"], + [0.00012345678, 0, "0.000123457"], + [0.0012345678, 0, "0.001234568"], + [0.012345678, 0, "0.012345678"], + [0.12345678, 0, "0.12345678"], + [1.2345678, 0, "1.2345678"], + [12.345678, 0, "12.345678"], + [123.45678, 0, "123.45678"], + [1234.5678, 0, "1234.5678"], + [12345.678, 0, "12345.678"], + [123456.78, 0, "123456.78"], + [1234567.8, 0, "1234567.8"], + [12345678, 0, "12345678"], + [123456780, 0, "123456780"], + [1234567800, 0, "1234567800"], + [12345678000, 0, "12345678000"], + [123456780000, 0, "1.23457E+11"], + [1234567800000, 0, "1.23457E+12"], + [12345678000000, 0, "1.23457E+13"], + [123456780000000, 0, "1.23457E+14"], + + [0.0000000000000123456789, 0, "1.23457E-14"], + [0.000000000000123456789, 0, "1.23457E-13"], + [0.00000000000123456789, 0, "1.23457E-12"], + [0.0000000000123456789, 0, "1.23457E-11"], + [0.000000000123456789, 0, "1.23457E-10"], + [0.00000000123456789, 0, "1.23457E-09"], + [0.0000000123456789, 0, "1.23457E-08"], + [0.000000123456789, 0, "1.23457E-07"], + [0.00000123456789, 0, "1.23457E-06"], + [0.0000123456789, 0, "1.23457E-05"], + [0.000123456789, 0, "0.000123457"], + [0.00123456789, 0, "0.001234568"], + [0.0123456789, 0, "0.012345679"], + [0.123456789, 0, "0.123456789"], + [1.23456789, 0, "1.23456789"], + [12.3456789, 0, "12.3456789"], + [123.456789, 0, "123.456789"], + [1234.56789, 0, "1234.56789"], + [12345.6789, 0, "12345.6789"], + [123456.789, 0, "123456.789"], + [1234567.89, 0, "1234567.89"], + [12345678.9, 0, "12345678.9"], + [123456789, 0, "123456789"], + [1234567890, 0, "1234567890"], + [12345678900, 0, "12345678900"], + [123456789000, 0, "1.23457E+11"], + [1234567890000, 0, "1.23457E+12"], + [12345678900000, 0, "1.23457E+13"], + [123456789000000, 0, "1.23457E+14"], + + [0.00000000000001234567891, 0, "1.23457E-14"], + [0.0000000000001234567891, 0, "1.23457E-13"], + [0.000000000001234567891, 0, "1.23457E-12"], + [0.00000000001234567891, 0, "1.23457E-11"], + [0.0000000001234567891, 0, "1.23457E-10"], + [0.000000001234567891, 0, "1.23457E-09"], + [0.00000001234567891, 0, "1.23457E-08"], + [0.0000001234567891, 0, "1.23457E-07"], + [0.000001234567891, 0, "1.23457E-06"], + [0.00001234567891, 0, "1.23457E-05"], + [0.0001234567891, 0, "0.000123457"], + [0.001234567891, 0, "0.001234568"], + [0.01234567891, 0, "0.012345679"], + [0.1234567891, 0, "0.123456789"], + [1.234567891, 0, "1.234567891"], + [12.34567891, 0, "12.34567891"], + [123.4567891, 0, "123.4567891"], + [1234.567891, 0, "1234.567891"], + [12345.67891, 0, "12345.67891"], + [123456.7891, 0, "123456.7891"], + [1234567.891, 0, "1234567.891"], + [12345678.91, 0, "12345678.91"], + [123456789.1, 0, "123456789.1"], + [1234567891, 0, "1234567891"], + [12345678910, 0, "12345678910"], + [123456789100, 0, "1.23457E+11"], + [1234567891000, 0, "1.23457E+12"], + [12345678910000, 0, "1.23457E+13"], + [123456789100000, 0, "1.23457E+14"], + + [0.000000000000012345678912, 0, "1.23457E-14"], + [0.00000000000012345678912, 0, "1.23457E-13"], + [0.0000000000012345678912, 0, "1.23457E-12"], + [0.000000000012345678912, 0, "1.23457E-11"], + [0.00000000012345678912, 0, "1.23457E-10"], + [0.0000000012345678912, 0, "1.23457E-09"], + [0.000000012345678912, 0, "1.23457E-08"], + [0.00000012345678912, 0, "1.23457E-07"], + [0.0000012345678912, 0, "1.23457E-06"], + [0.000012345678912, 0, "1.23457E-05"], + [0.00012345678912, 0, "0.000123457"], + [0.0012345678912, 0, "0.001234568"], + [0.012345678912, 0, "0.012345679"], + [0.12345678912, 0, "0.123456789"], + [1.2345678912, 0, "1.234567891"], + [12.345678912, 0, "12.34567891"], + [123.45678912, 0, "123.4567891"], + [1234.5678912, 0, "1234.567891"], + [12345.678912, 0, "12345.67891"], + [123456.78912, 0, "123456.7891"], + [1234567.8912, 0, "1234567.891"], + [12345678.912, 0, "12345678.91"], + [123456789.12, 0, "123456789.1"], + [1234567891.2, 0, "1234567891"], + [12345678912, 0, "12345678912"], + [123456789120, 0, "1.23457E+11"], + [1234567891200, 0, "1.23457E+12"], + [12345678912000, 0, "1.23457E+13"], + [123456789120000, 0, "1.23457E+14"], + + [0.0000000000000123456789123, 0, "1.23457E-14"], + [0.000000000000123456789123, 0, "1.23457E-13"], + [0.00000000000123456789123, 0, "1.23457E-12"], + [0.0000000000123456789123, 0, "1.23457E-11"], + [0.000000000123456789123, 0, "1.23457E-10"], + [0.00000000123456789123, 0, "1.23457E-09"], + [0.0000000123456789123, 0, "1.23457E-08"], + [0.000000123456789123, 0, "1.23457E-07"], + [0.00000123456789123, 0, "1.23457E-06"], + [0.0000123456789123, 0, "1.23457E-05"], + [0.000123456789123, 0, "0.000123457"], + [0.00123456789123, 0, "0.001234568"], + [0.0123456789123, 0, "0.012345679"], + [0.123456789123, 0, "0.123456789"], + [1.23456789123, 0, "1.234567891"], + [12.3456789123, 0, "12.34567891"], + [123.456789123, 0, "123.4567891"], + [1234.56789123, 0, "1234.567891"], + [12345.6789123, 0, "12345.67891"], + [123456.789123, 0, "123456.7891"], + [1234567.89123, 0, "1234567.891"], + [12345678.9123, 0, "12345678.91"], + [123456789.123, 0, "123456789.1"], + [1234567891.23, 0, "1234567891"], + [12345678912.3, 0, "12345678912"], + [123456789123, 0, "1.23457E+11"], + [1234567891230, 0, "1.23457E+12"], + [12345678912300, 0, "1.23457E+13"], + [123456789123000, 0, "1.23457E+14"], + + [0.00000000000001234567891234, 0, "1.23457E-14"], + [0.0000000000001234567891234, 0, "1.23457E-13"], + [0.000000000001234567891234, 0, "1.23457E-12"], + [0.00000000001234567891234, 0, "1.23457E-11"], + [0.0000000001234567891234, 0, "1.23457E-10"], + [0.000000001234567891234, 0, "1.23457E-09"], + [0.00000001234567891234, 0, "1.23457E-08"], + [0.0000001234567891234, 0, "1.23457E-07"], + [0.000001234567891234, 0, "1.23457E-06"], + [0.00001234567891234, 0, "1.23457E-05"], + [0.0001234567891234, 0, "0.000123457"], + [0.001234567891234, 0, "0.001234568"], + [0.01234567891234, 0, "0.012345679"], + [0.1234567891234, 0, "0.123456789"], + [1.234567891234, 0, "1.234567891"], + [12.34567891234, 0, "12.34567891"], + [123.4567891234, 0, "123.4567891"], + [1234.567891234, 0, "1234.567891"], + [12345.67891234, 0, "12345.67891"], + [123456.7891234, 0, "123456.7891"], + [1234567.891234, 0, "1234567.891"], + [12345678.91234, 0, "12345678.91"], + [123456789.1234, 0, "123456789.1"], + [1234567891.234, 0, "1234567891"], + [12345678912.34, 0, "12345678912"], + [123456789123.4, 0, "1.23457E+11"], + [1234567891234, 0, "1.23457E+12"], + [12345678912340, 0, "1.23457E+13"], + [123456789123400, 0, "1.23457E+14"], + + [0.000000000000012345678912345, 0, "1.23457E-14"], + [0.00000000000012345678912345, 0, "1.23457E-13"], + [0.0000000000012345678912345, 0, "1.23457E-12"], + [0.000000000012345678912345, 0, "1.23457E-11"], + [0.00000000012345678912345, 0, "1.23457E-10"], + [0.0000000012345678912345, 0, "1.23457E-09"], + [0.000000012345678912345, 0, "1.23457E-08"], + [0.00000012345678912345, 0, "1.23457E-07"], + [0.0000012345678912345, 0, "1.23457E-06"], + [0.000012345678912345, 0, "1.23457E-05"], + [0.00012345678912345, 0, "0.000123457"], + [0.0012345678912345, 0, "0.001234568"], + [0.012345678912345, 0, "0.012345679"], + [0.12345678912345, 0, "0.123456789"], + [1.2345678912345, 0, "1.234567891"], + [12.345678912345, 0, "12.34567891"], + [123.45678912345, 0, "123.4567891"], + [1234.5678912345, 0, "1234.567891"], + [12345.678912345, 0, "12345.67891"], + [123456.78912345, 0, "123456.7891"], + [1234567.8912345, 0, "1234567.891"], + [12345678.912345, 0, "12345678.91"], + [123456789.12345, 0, "123456789.1"], + [1234567891.2345, 0, "1234567891"], + [12345678912.345, 0, "12345678912"], + [123456789123.45, 0, "1.23457E+11"], + [1234567891234.5, 0, "1.23457E+12"], + [12345678912345, 0, "1.23457E+13"], + [123456789123450, 0, "1.23457E+14"], + + [0.0000000000000123456789123456, 0, "1.23457E-14"], + [0.000000000000123456789123456, 0, "1.23457E-13"], + [0.00000000000123456789123456, 0, "1.23457E-12"], + [0.0000000000123456789123456, 0, "1.23457E-11"], + [0.000000000123456789123456, 0, "1.23457E-10"], + [0.00000000123456789123456, 0, "1.23457E-09"], + [0.0000000123456789123456, 0, "1.23457E-08"], + [0.000000123456789123456, 0, "1.23457E-07"], + [0.00000123456789123456, 0, "1.23457E-06"], + [0.0000123456789123456, 0, "1.23457E-05"], + [0.000123456789123456, 0, "0.000123457"], + [0.00123456789123456, 0, "0.001234568"], + [0.0123456789123456, 0, "0.012345679"], + [0.123456789123456, 0, "0.123456789"], + [1.23456789123456, 0, "1.234567891"], + [12.3456789123456, 0, "12.34567891"], + [123.456789123456, 0, "123.4567891"], + [1234.56789123456, 0, "1234.567891"], + [12345.6789123456, 0, "12345.67891"], + [123456.789123456, 0, "123456.7891"], + [1234567.89123456, 0, "1234567.891"], + [12345678.9123456, 0, "12345678.91"], + [123456789.123456, 0, "123456789.1"], + [1234567891.23456, 0, "1234567891"], + [12345678912.3456, 0, "12345678912"], + [123456789123.456, 0, "1.23457E+11"], + [1234567891234.56, 0, "1.23457E+12"], + [12345678912345.6, 0, "1.23457E+13"], + [123456789123456, 0, "1.23457E+14"], + + [-0.00000000000001234567, 0, "-1.23457E-14"], + [-0.0000000000001234567, 0, "-1.23457E-13"], + [-0.000000000001234567, 0, "-1.23457E-12"], + [-0.00000000001234567, 0, "-1.23457E-11"], + [-0.0000000001234567, 0, "-1.23457E-10"], + [-0.000000001234567, 0, "-1.23457E-09"], + [-0.00000001234567, 0, "-1.23457E-08"], + [-0.0000001234567, 0, "-1.23457E-07"], + [-0.000001234567, 0, "-1.23457E-06"], + [-0.00001234567, 0, "-1.23457E-05"], + [-0.0001234567, 0, "-0.000123457"], + [-0.001234567, 0, "-0.001234567"], + [-0.01234567, 0, "-0.01234567"], + [-0.1234567, 0, "-0.1234567"], + [-1.234567, 0, "-1.234567"], + [-12.34567, 0, "-12.34567"], + [-123.4567, 0, "-123.4567"], + [-1234.567, 0, "-1234.567"], + [-12345.67, 0, "-12345.67"], + [-123456.7, 0, "-123456.7"], + [-1234567, 0, "-1234567"], + [-12345670, 0, "-12345670"], + [-123456700, 0, "-123456700"], + [-1234567000, 0, "-1234567000"], + [-12345670000, 0, "-12345670000"], + [-123456700000, 0, "-1.23457E+11"], + [-1234567000000, 0, "-1.23457E+12"], + [-12345670000000, 0, "-1.23457E+13"], + [-123456700000000, 0, "-1.23457E+14"], + + [true, 0, "TRUE"], + [false, 0, "FALSE"], + + ["sheetjs", 0, "sheetjs"] +] diff --git a/test/implied.json b/test/implied.json index 5bc4cd4..d4d63f8 100644 --- a/test/implied.json +++ b/test/implied.json @@ -57,519 +57,6 @@ [-12345.6789, 48, "-12.3E+3"], [-12345.6789, 49, "-12345.6789"], - [1.234567E-14, 0, "1.23457E-14"], - [1.234567E-13, 0, "1.23457E-13"], - [1.234567E-12, 0, "1.23457E-12"], - [1.234567E-11, 0, "1.23457E-11"], - [1.234567E-10, 0, "1.23457E-10"], - [1.234567E-9, 0, "1.23457E-09"], - [1.234567E-8, 0, "1.23457E-08"], - [1.234567E-7, 0, "1.23457E-07"], - [1.234567E-6, 0, "1.23457E-06"], - [1.234567E-5, 0, "1.23457E-05"], - [1.234567E-4, 0, "0.000123457"], - [1.234567E-3, 0, "0.001234567"], - [1.234567E-2, 0, "0.01234567"], - [1.234567E-1, 0, "0.1234567"], - [1.234567E0, 0, "1.234567"], - [1.234567E1, 0, "12.34567"], - [1.234567E2, 0, "123.4567"], - [1.234567E3, 0, "1234.567"], - [1.234567E4, 0, "12345.67"], - [1.234567E5, 0, "123456.7"], - [1.234567E6, 0, "1234567"], - [1.234567E7, 0, "12345670"], - [1.234567E8, 0, "123456700"], - [1.234567E9, 0, "1234567000"], - [1.234567E10, 0, "12345670000"], - [1.234567E11, 0, "1.23457E+11"], - [1.234567E12, 0, "1.23457E+12"], - [1.234567E13, 0, "1.23457E+13"], - [1.234567E14, 0, "1.23457E+14"], - - [0.00000000000001, 0, "1E-14"], - [0.0000000000001, 0, "1E-13"], - [0.000000000001, 0, "1E-12"], - [0.00000000001, 0, "1E-11"], - [0.0000000001, 0, "1E-10"], - [0.000000001, 0, "0.000000001"], - [0.00000001, 0, "0.00000001"], - [0.0000001, 0, "0.0000001"], - [0.000001, 0, "0.000001"], - [0.00001, 0, "0.00001"], - [0.0001, 0, "0.0001"], - [0.001, 0, "0.001"], - [0.01, 0, "0.01"], - [0.1, 0, "0.1"], - [1, 0, "1"], - [10, 0, "10"], - [100, 0, "100"], - [1000, 0, "1000"], - [10000, 0, "10000"], - [100000, 0, "100000"], - [1000000, 0, "1000000"], - [10000000, 0, "10000000"], - [100000000, 0, "100000000"], - [1000000000, 0, "1000000000"], - [10000000000, 0, "10000000000"], - [100000000000, 0, "1E+11"], - [1000000000000, 0, "1E+12"], - [10000000000000, 0, "1E+13"], - [100000000000000, 0, "1E+14"], - - [0.000000000000012, 0, "1.2E-14"], - [0.00000000000012, 0, "1.2E-13"], - [0.0000000000012, 0, "1.2E-12"], - [0.000000000012, 0, "1.2E-11"], - [0.00000000012, 0, "1.2E-10"], - [0.0000000012, 0, "1.2E-09"], - [0.000000012, 0, "0.000000012"], - [0.00000012, 0, "0.00000012"], - [0.0000012, 0, "0.0000012"], - [0.000012, 0, "0.000012"], - [0.00012, 0, "0.00012"], - [0.0012, 0, "0.0012"], - [0.012, 0, "0.012"], - [0.12, 0, "0.12"], - [1.2, 0, "1.2"], - [12, 0, "12"], - [120, 0, "120"], - [1200, 0, "1200"], - [12000, 0, "12000"], - [120000, 0, "120000"], - [1200000, 0, "1200000"], - [12000000, 0, "12000000"], - [120000000, 0, "120000000"], - [1200000000, 0, "1200000000"], - [12000000000, 0, "12000000000"], - [120000000000, 0, "1.2E+11"], - [1200000000000, 0, "1.2E+12"], - [12000000000000, 0, "1.2E+13"], - [120000000000000, 0, "1.2E+14"], - - [0.0000000000000123, 0, "1.23E-14"], - [0.000000000000123, 0, "1.23E-13"], - [0.00000000000123, 0, "1.23E-12"], - [0.0000000000123, 0, "1.23E-11"], - [0.000000000123, 0, "1.23E-10"], - [0.00000000123, 0, "1.23E-09"], - [0.0000000123, 0, "1.23E-08"], - [0.000000123, 0, "0.000000123"], - [0.00000123, 0, "0.00000123"], - [0.0000123, 0, "0.0000123"], - [0.000123, 0, "0.000123"], - [0.00123, 0, "0.00123"], - [0.0123, 0, "0.0123"], - [0.123, 0, "0.123"], - [1.23, 0, "1.23"], - [12.3, 0, "12.3"], - [123, 0, "123"], - [1230, 0, "1230"], - [12300, 0, "12300"], - [123000, 0, "123000"], - [1230000, 0, "1230000"], - [12300000, 0, "12300000"], - [123000000, 0, "123000000"], - [1230000000, 0, "1230000000"], - [12300000000, 0, "12300000000"], - [123000000000, 0, "1.23E+11"], - [1230000000000, 0, "1.23E+12"], - [12300000000000, 0, "1.23E+13"], - [123000000000000, 0, "1.23E+14"], - - [0.00000000000001234, 0, "1.234E-14"], - [0.0000000000001234, 0, "1.234E-13"], - [0.000000000001234, 0, "1.234E-12"], - [0.00000000001234, 0, "1.234E-11"], - [0.0000000001234, 0, "1.234E-10"], - [0.000000001234, 0, "1.234E-09"], - [0.00000001234, 0, "1.234E-08"], - [0.0000001234, 0, "1.234E-07"], - [0.000001234, 0, "0.000001234"], - [0.00001234, 0, "0.00001234"], - [0.0001234, 0, "0.0001234"], - [0.001234, 0, "0.001234"], - [0.01234, 0, "0.01234"], - [0.1234, 0, "0.1234"], - [1.234, 0, "1.234"], - [12.34, 0, "12.34"], - [123.4, 0, "123.4"], - [1234, 0, "1234"], - [12340, 0, "12340"], - [123400, 0, "123400"], - [1234000, 0, "1234000"], - [12340000, 0, "12340000"], - [123400000, 0, "123400000"], - [1234000000, 0, "1234000000"], - [12340000000, 0, "12340000000"], - [123400000000, 0, "1.234E+11"], - [1234000000000, 0, "1.234E+12"], - [12340000000000, 0, "1.234E+13"], - [123400000000000, 0, "1.234E+14"], - - [0.000000000000012345, 0, "1.2345E-14"], - [0.00000000000012345, 0, "1.2345E-13"], - [0.0000000000012345, 0, "1.2345E-12"], - [0.000000000012345, 0, "1.2345E-11"], - [0.00000000012345, 0, "1.2345E-10"], - [0.0000000012345, 0, "1.2345E-09"], - [0.000000012345, 0, "1.2345E-08"], - [0.00000012345, 0, "1.2345E-07"], - [0.0000012345, 0, "1.2345E-06"], - [0.000012345, 0, "0.000012345"], - [0.00012345, 0, "0.00012345"], - [0.0012345, 0, "0.0012345"], - [0.012345, 0, "0.012345"], - [0.12345, 0, "0.12345"], - [1.2345, 0, "1.2345"], - [12.345, 0, "12.345"], - [123.45, 0, "123.45"], - [1234.5, 0, "1234.5"], - [12345, 0, "12345"], - [123450, 0, "123450"], - [1234500, 0, "1234500"], - [12345000, 0, "12345000"], - [123450000, 0, "123450000"], - [1234500000, 0, "1234500000"], - [12345000000, 0, "12345000000"], - [123450000000, 0, "1.2345E+11"], - [1234500000000, 0, "1.2345E+12"], - [12345000000000, 0, "1.2345E+13"], - [123450000000000, 0, "1.2345E+14"], - - [0.0000000000000123456, 0, "1.23456E-14"], - [0.000000000000123456, 0, "1.23456E-13"], - [0.00000000000123456, 0, "1.23456E-12"], - [0.0000000000123456, 0, "1.23456E-11"], - [0.000000000123456, 0, "1.23456E-10"], - [0.00000000123456, 0, "1.23456E-09"], - [0.0000000123456, 0, "1.23456E-08"], - [0.000000123456, 0, "1.23456E-07"], - [0.00000123456, 0, "1.23456E-06"], - [0.0000123456, 0, "1.23456E-05"], - [0.000123456, 0, "0.000123456"], - [0.00123456, 0, "0.00123456"], - [0.0123456, 0, "0.0123456"], - [0.123456, 0, "0.123456"], - [1.23456, 0, "1.23456"], - [12.3456, 0, "12.3456"], - [123.456, 0, "123.456"], - [1234.56, 0, "1234.56"], - [12345.6, 0, "12345.6"], - [123456, 0, "123456"], - [1234560, 0, "1234560"], - [12345600, 0, "12345600"], - [123456000, 0, "123456000"], - [1234560000, 0, "1234560000"], - [12345600000, 0, "12345600000"], - [123456000000, 0, "1.23456E+11"], - [1234560000000, 0, "1.23456E+12"], - [12345600000000, 0, "1.23456E+13"], - [123456000000000, 0, "1.23456E+14"], - - [0.00000000000001234567, 0, "1.23457E-14"], - [0.0000000000001234567, 0, "1.23457E-13"], - [0.000000000001234567, 0, "1.23457E-12"], - [0.00000000001234567, 0, "1.23457E-11"], - [0.0000000001234567, 0, "1.23457E-10"], - [0.000000001234567, 0, "1.23457E-09"], - [0.00000001234567, 0, "1.23457E-08"], - [0.0000001234567, 0, "1.23457E-07"], - [0.000001234567, 0, "1.23457E-06"], - [0.00001234567, 0, "1.23457E-05"], - [0.0001234567, 0, "0.000123457"], - [0.001234567, 0, "0.001234567"], - [0.01234567, 0, "0.01234567"], - [0.1234567, 0, "0.1234567"], - [1.234567, 0, "1.234567"], - [12.34567, 0, "12.34567"], - [123.4567, 0, "123.4567"], - [1234.567, 0, "1234.567"], - [12345.67, 0, "12345.67"], - [123456.7, 0, "123456.7"], - [1234567, 0, "1234567"], - [12345670, 0, "12345670"], - [123456700, 0, "123456700"], - [1234567000, 0, "1234567000"], - [12345670000, 0, "12345670000"], - [123456700000, 0, "1.23457E+11"], - [1234567000000, 0, "1.23457E+12"], - [12345670000000, 0, "1.23457E+13"], - [123456700000000, 0, "1.23457E+14"], - - [0.000000000000012345678, 0, "1.23457E-14"], - [0.00000000000012345678, 0, "1.23457E-13"], - [0.0000000000012345678, 0, "1.23457E-12"], - [0.000000000012345678, 0, "1.23457E-11"], - [0.00000000012345678, 0, "1.23457E-10"], - [0.0000000012345678, 0, "1.23457E-09"], - [0.000000012345678, 0, "1.23457E-08"], - [0.00000012345678, 0, "1.23457E-07"], - [0.0000012345678, 0, "1.23457E-06"], - [0.000012345678, 0, "1.23457E-05"], - [0.00012345678, 0, "0.000123457"], - [0.0012345678, 0, "0.001234568"], - [0.012345678, 0, "0.012345678"], - [0.12345678, 0, "0.12345678"], - [1.2345678, 0, "1.2345678"], - [12.345678, 0, "12.345678"], - [123.45678, 0, "123.45678"], - [1234.5678, 0, "1234.5678"], - [12345.678, 0, "12345.678"], - [123456.78, 0, "123456.78"], - [1234567.8, 0, "1234567.8"], - [12345678, 0, "12345678"], - [123456780, 0, "123456780"], - [1234567800, 0, "1234567800"], - [12345678000, 0, "12345678000"], - [123456780000, 0, "1.23457E+11"], - [1234567800000, 0, "1.23457E+12"], - [12345678000000, 0, "1.23457E+13"], - [123456780000000, 0, "1.23457E+14"], - - [0.0000000000000123456789, 0, "1.23457E-14"], - [0.000000000000123456789, 0, "1.23457E-13"], - [0.00000000000123456789, 0, "1.23457E-12"], - [0.0000000000123456789, 0, "1.23457E-11"], - [0.000000000123456789, 0, "1.23457E-10"], - [0.00000000123456789, 0, "1.23457E-09"], - [0.0000000123456789, 0, "1.23457E-08"], - [0.000000123456789, 0, "1.23457E-07"], - [0.00000123456789, 0, "1.23457E-06"], - [0.0000123456789, 0, "1.23457E-05"], - [0.000123456789, 0, "0.000123457"], - [0.00123456789, 0, "0.001234568"], - [0.0123456789, 0, "0.012345679"], - [0.123456789, 0, "0.123456789"], - [1.23456789, 0, "1.23456789"], - [12.3456789, 0, "12.3456789"], - [123.456789, 0, "123.456789"], - [1234.56789, 0, "1234.56789"], - [12345.6789, 0, "12345.6789"], - [123456.789, 0, "123456.789"], - [1234567.89, 0, "1234567.89"], - [12345678.9, 0, "12345678.9"], - [123456789, 0, "123456789"], - [1234567890, 0, "1234567890"], - [12345678900, 0, "12345678900"], - [123456789000, 0, "1.23457E+11"], - [1234567890000, 0, "1.23457E+12"], - [12345678900000, 0, "1.23457E+13"], - [123456789000000, 0, "1.23457E+14"], - - [0.00000000000001234567891, 0, "1.23457E-14"], - [0.0000000000001234567891, 0, "1.23457E-13"], - [0.000000000001234567891, 0, "1.23457E-12"], - [0.00000000001234567891, 0, "1.23457E-11"], - [0.0000000001234567891, 0, "1.23457E-10"], - [0.000000001234567891, 0, "1.23457E-09"], - [0.00000001234567891, 0, "1.23457E-08"], - [0.0000001234567891, 0, "1.23457E-07"], - [0.000001234567891, 0, "1.23457E-06"], - [0.00001234567891, 0, "1.23457E-05"], - [0.0001234567891, 0, "0.000123457"], - [0.001234567891, 0, "0.001234568"], - [0.01234567891, 0, "0.012345679"], - [0.1234567891, 0, "0.123456789"], - [1.234567891, 0, "1.234567891"], - [12.34567891, 0, "12.34567891"], - [123.4567891, 0, "123.4567891"], - [1234.567891, 0, "1234.567891"], - [12345.67891, 0, "12345.67891"], - [123456.7891, 0, "123456.7891"], - [1234567.891, 0, "1234567.891"], - [12345678.91, 0, "12345678.91"], - [123456789.1, 0, "123456789.1"], - [1234567891, 0, "1234567891"], - [12345678910, 0, "12345678910"], - [123456789100, 0, "1.23457E+11"], - [1234567891000, 0, "1.23457E+12"], - [12345678910000, 0, "1.23457E+13"], - [123456789100000, 0, "1.23457E+14"], - - [0.000000000000012345678912, 0, "1.23457E-14"], - [0.00000000000012345678912, 0, "1.23457E-13"], - [0.0000000000012345678912, 0, "1.23457E-12"], - [0.000000000012345678912, 0, "1.23457E-11"], - [0.00000000012345678912, 0, "1.23457E-10"], - [0.0000000012345678912, 0, "1.23457E-09"], - [0.000000012345678912, 0, "1.23457E-08"], - [0.00000012345678912, 0, "1.23457E-07"], - [0.0000012345678912, 0, "1.23457E-06"], - [0.000012345678912, 0, "1.23457E-05"], - [0.00012345678912, 0, "0.000123457"], - [0.0012345678912, 0, "0.001234568"], - [0.012345678912, 0, "0.012345679"], - [0.12345678912, 0, "0.123456789"], - [1.2345678912, 0, "1.234567891"], - [12.345678912, 0, "12.34567891"], - [123.45678912, 0, "123.4567891"], - [1234.5678912, 0, "1234.567891"], - [12345.678912, 0, "12345.67891"], - [123456.78912, 0, "123456.7891"], - [1234567.8912, 0, "1234567.891"], - [12345678.912, 0, "12345678.91"], - [123456789.12, 0, "123456789.1"], - [1234567891.2, 0, "1234567891"], - [12345678912, 0, "12345678912"], - [123456789120, 0, "1.23457E+11"], - [1234567891200, 0, "1.23457E+12"], - [12345678912000, 0, "1.23457E+13"], - [123456789120000, 0, "1.23457E+14"], - - [0.0000000000000123456789123, 0, "1.23457E-14"], - [0.000000000000123456789123, 0, "1.23457E-13"], - [0.00000000000123456789123, 0, "1.23457E-12"], - [0.0000000000123456789123, 0, "1.23457E-11"], - [0.000000000123456789123, 0, "1.23457E-10"], - [0.00000000123456789123, 0, "1.23457E-09"], - [0.0000000123456789123, 0, "1.23457E-08"], - [0.000000123456789123, 0, "1.23457E-07"], - [0.00000123456789123, 0, "1.23457E-06"], - [0.0000123456789123, 0, "1.23457E-05"], - [0.000123456789123, 0, "0.000123457"], - [0.00123456789123, 0, "0.001234568"], - [0.0123456789123, 0, "0.012345679"], - [0.123456789123, 0, "0.123456789"], - [1.23456789123, 0, "1.234567891"], - [12.3456789123, 0, "12.34567891"], - [123.456789123, 0, "123.4567891"], - [1234.56789123, 0, "1234.567891"], - [12345.6789123, 0, "12345.67891"], - [123456.789123, 0, "123456.7891"], - [1234567.89123, 0, "1234567.891"], - [12345678.9123, 0, "12345678.91"], - [123456789.123, 0, "123456789.1"], - [1234567891.23, 0, "1234567891"], - [12345678912.3, 0, "12345678912"], - [123456789123, 0, "1.23457E+11"], - [1234567891230, 0, "1.23457E+12"], - [12345678912300, 0, "1.23457E+13"], - [123456789123000, 0, "1.23457E+14"], - - [0.00000000000001234567891234, 0, "1.23457E-14"], - [0.0000000000001234567891234, 0, "1.23457E-13"], - [0.000000000001234567891234, 0, "1.23457E-12"], - [0.00000000001234567891234, 0, "1.23457E-11"], - [0.0000000001234567891234, 0, "1.23457E-10"], - [0.000000001234567891234, 0, "1.23457E-09"], - [0.00000001234567891234, 0, "1.23457E-08"], - [0.0000001234567891234, 0, "1.23457E-07"], - [0.000001234567891234, 0, "1.23457E-06"], - [0.00001234567891234, 0, "1.23457E-05"], - [0.0001234567891234, 0, "0.000123457"], - [0.001234567891234, 0, "0.001234568"], - [0.01234567891234, 0, "0.012345679"], - [0.1234567891234, 0, "0.123456789"], - [1.234567891234, 0, "1.234567891"], - [12.34567891234, 0, "12.34567891"], - [123.4567891234, 0, "123.4567891"], - [1234.567891234, 0, "1234.567891"], - [12345.67891234, 0, "12345.67891"], - [123456.7891234, 0, "123456.7891"], - [1234567.891234, 0, "1234567.891"], - [12345678.91234, 0, "12345678.91"], - [123456789.1234, 0, "123456789.1"], - [1234567891.234, 0, "1234567891"], - [12345678912.34, 0, "12345678912"], - [123456789123.4, 0, "1.23457E+11"], - [1234567891234, 0, "1.23457E+12"], - [12345678912340, 0, "1.23457E+13"], - [123456789123400, 0, "1.23457E+14"], - - [0.000000000000012345678912345, 0, "1.23457E-14"], - [0.00000000000012345678912345, 0, "1.23457E-13"], - [0.0000000000012345678912345, 0, "1.23457E-12"], - [0.000000000012345678912345, 0, "1.23457E-11"], - [0.00000000012345678912345, 0, "1.23457E-10"], - [0.0000000012345678912345, 0, "1.23457E-09"], - [0.000000012345678912345, 0, "1.23457E-08"], - [0.00000012345678912345, 0, "1.23457E-07"], - [0.0000012345678912345, 0, "1.23457E-06"], - [0.000012345678912345, 0, "1.23457E-05"], - [0.00012345678912345, 0, "0.000123457"], - [0.0012345678912345, 0, "0.001234568"], - [0.012345678912345, 0, "0.012345679"], - [0.12345678912345, 0, "0.123456789"], - [1.2345678912345, 0, "1.234567891"], - [12.345678912345, 0, "12.34567891"], - [123.45678912345, 0, "123.4567891"], - [1234.5678912345, 0, "1234.567891"], - [12345.678912345, 0, "12345.67891"], - [123456.78912345, 0, "123456.7891"], - [1234567.8912345, 0, "1234567.891"], - [12345678.912345, 0, "12345678.91"], - [123456789.12345, 0, "123456789.1"], - [1234567891.2345, 0, "1234567891"], - [12345678912.345, 0, "12345678912"], - [123456789123.45, 0, "1.23457E+11"], - [1234567891234.5, 0, "1.23457E+12"], - [12345678912345, 0, "1.23457E+13"], - [123456789123450, 0, "1.23457E+14"], - - [0.0000000000000123456789123456, 0, "1.23457E-14"], - [0.000000000000123456789123456, 0, "1.23457E-13"], - [0.00000000000123456789123456, 0, "1.23457E-12"], - [0.0000000000123456789123456, 0, "1.23457E-11"], - [0.000000000123456789123456, 0, "1.23457E-10"], - [0.00000000123456789123456, 0, "1.23457E-09"], - [0.0000000123456789123456, 0, "1.23457E-08"], - [0.000000123456789123456, 0, "1.23457E-07"], - [0.00000123456789123456, 0, "1.23457E-06"], - [0.0000123456789123456, 0, "1.23457E-05"], - [0.000123456789123456, 0, "0.000123457"], - [0.00123456789123456, 0, "0.001234568"], - [0.0123456789123456, 0, "0.012345679"], - [0.123456789123456, 0, "0.123456789"], - [1.23456789123456, 0, "1.234567891"], - [12.3456789123456, 0, "12.34567891"], - [123.456789123456, 0, "123.4567891"], - [1234.56789123456, 0, "1234.567891"], - [12345.6789123456, 0, "12345.67891"], - [123456.789123456, 0, "123456.7891"], - [1234567.89123456, 0, "1234567.891"], - [12345678.9123456, 0, "12345678.91"], - [123456789.123456, 0, "123456789.1"], - [1234567891.23456, 0, "1234567891"], - [12345678912.3456, 0, "12345678912"], - [123456789123.456, 0, "1.23457E+11"], - [1234567891234.56, 0, "1.23457E+12"], - [12345678912345.6, 0, "1.23457E+13"], - [123456789123456, 0, "1.23457E+14"], - - [-0.00000000000001234567, 0, "-1.23457E-14"], - [-0.0000000000001234567, 0, "-1.23457E-13"], - [-0.000000000001234567, 0, "-1.23457E-12"], - [-0.00000000001234567, 0, "-1.23457E-11"], - [-0.0000000001234567, 0, "-1.23457E-10"], - [-0.000000001234567, 0, "-1.23457E-09"], - [-0.00000001234567, 0, "-1.23457E-08"], - [-0.0000001234567, 0, "-1.23457E-07"], - [-0.000001234567, 0, "-1.23457E-06"], - [-0.00001234567, 0, "-1.23457E-05"], - [-0.0001234567, 0, "-0.000123457"], - [-0.001234567, 0, "-0.001234567"], - [-0.01234567, 0, "-0.01234567"], - [-0.1234567, 0, "-0.1234567"], - [-1.234567, 0, "-1.234567"], - [-12.34567, 0, "-12.34567"], - [-123.4567, 0, "-123.4567"], - [-1234.567, 0, "-1234.567"], - [-12345.67, 0, "-12345.67"], - [-123456.7, 0, "-123456.7"], - [-1234567, 0, "-1234567"], - [-12345670, 0, "-12345670"], - [-123456700, 0, "-123456700"], - [-1234567000, 0, "-1234567000"], - [-12345670000, 0, "-12345670000"], - [-123456700000, 0, "-1.23457E+11"], - [-1234567000000, 0, "-1.23457E+12"], - [-12345670000000, 0, "-1.23457E+13"], - [-123456700000000, 0, "-1.23457E+14"], - - [true, 0, "TRUE"], - [false, 0, "FALSE"], - [11.666666666666666, 0, "11.66666667"], [5.057996968497839, 0, "5.057996968"], [4.380353866983808, 0, "4.380353867"],