version bump 0.4.0: improvements across the board

- Proper fraction handling (using frac.cont)
- Better handling of negative number cases
- More tests!
This commit is contained in:
SheetJS 2013-12-26 17:35:42 -05:00
parent 5a49d84ae6
commit 43f8f00ef5
9 changed files with 820 additions and 603 deletions

@ -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" ],

67
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]);
};

125
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

@ -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]);
};

14
test/fraction.js Normal file

@ -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);
});
});
});

107
test/fraction.json Normal file

@ -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"]
]

12
test/general.js Normal file

@ -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]);
});
});
});

516
test/general.json Normal file

@ -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"]
]

@ -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"],