2021-09-12 11:11:48 +00:00
|
|
|
|
/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
|
|
|
|
/* vim: set ts=2: */
|
|
|
|
|
/*exported XLSX */
|
2022-03-16 03:18:09 +00:00
|
|
|
|
/*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var XLSX = {};
|
2024-07-12 15:47:14 +00:00
|
|
|
|
XLSX.version = '0.20.3';
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var current_codepage = 1200, current_ansi = 1252;
|
2022-05-22 23:51:41 +00:00
|
|
|
|
/*:: declare var cptable:any; */
|
|
|
|
|
/*global cptable:true, window */
|
|
|
|
|
var $cptable;
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-11 05:29:05 +00:00
|
|
|
|
var VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];
|
2021-09-12 11:11:48 +00:00
|
|
|
|
/* ECMA-376 Part I 18.4.1 charset to codepage mapping */
|
|
|
|
|
var CS2CP = ({
|
2024-04-05 01:20:28 +00:00
|
|
|
|
0: 1252, /* ANSI */
|
|
|
|
|
1: 65001, /* DEFAULT */
|
|
|
|
|
2: 65001, /* SYMBOL */
|
|
|
|
|
77: 10000, /* MAC */
|
|
|
|
|
128: 932, /* SHIFTJIS */
|
|
|
|
|
129: 949, /* HANGUL */
|
|
|
|
|
130: 1361, /* JOHAB */
|
|
|
|
|
134: 936, /* GB2312 */
|
|
|
|
|
136: 950, /* CHINESEBIG5 */
|
|
|
|
|
161: 1253, /* GREEK */
|
|
|
|
|
162: 1254, /* TURKISH */
|
|
|
|
|
163: 1258, /* VIETNAMESE */
|
|
|
|
|
177: 1255, /* HEBREW */
|
|
|
|
|
178: 1256, /* ARABIC */
|
|
|
|
|
186: 1257, /* BALTIC */
|
|
|
|
|
204: 1251, /* RUSSIAN */
|
|
|
|
|
222: 874, /* THAI */
|
|
|
|
|
238: 1250, /* EASTEUROPE */
|
|
|
|
|
255: 1252, /* OEM */
|
|
|
|
|
69: 6969 /* MISC */
|
2021-09-12 11:11:48 +00:00
|
|
|
|
}/*:any*/);
|
|
|
|
|
|
|
|
|
|
var set_ansi = function(cp/*:number*/) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };
|
|
|
|
|
function reset_ansi() { set_ansi(1252); }
|
|
|
|
|
|
|
|
|
|
var set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
|
|
|
|
|
function reset_cp() { set_cp(1200); reset_ansi(); }
|
|
|
|
|
|
|
|
|
|
function char_codes(data/*:string*/)/*:Array<number>*/ { var o/*:Array<number>*/ = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }
|
|
|
|
|
|
|
|
|
|
function utf16leread(data/*:string*/)/*:string*/ {
|
|
|
|
|
var o/*:Array<string>*/ = [];
|
|
|
|
|
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));
|
|
|
|
|
return o.join("");
|
|
|
|
|
}
|
2023-03-15 08:17:09 +00:00
|
|
|
|
function utf16lereadu(data/*:Uint8Array*/)/*:string*/ {
|
|
|
|
|
var o/*:Array<string>*/ = [];
|
|
|
|
|
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data[2*i] + (data[2*i+1]<<8));
|
|
|
|
|
return o.join("");
|
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
function utf16beread(data/*:string*/)/*:string*/ {
|
|
|
|
|
var o/*:Array<string>*/ = [];
|
|
|
|
|
for(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));
|
|
|
|
|
return o.join("");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var debom = function(data/*:string*/)/*:string*/ {
|
|
|
|
|
var c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);
|
|
|
|
|
if(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));
|
|
|
|
|
if(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));
|
|
|
|
|
if(c1 == 0xFEFF) return data.slice(1);
|
|
|
|
|
return data;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
|
|
|
|
|
var _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };
|
2022-02-12 06:31:47 +00:00
|
|
|
|
|
2022-03-11 05:29:05 +00:00
|
|
|
|
function set_cptable(cptable) {
|
|
|
|
|
$cptable = cptable;
|
2022-02-12 06:31:47 +00:00
|
|
|
|
set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };
|
|
|
|
|
debom = function(data/*:string*/) {
|
2022-03-11 05:29:05 +00:00
|
|
|
|
if(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }
|
2022-02-12 06:31:47 +00:00
|
|
|
|
return data;
|
|
|
|
|
};
|
|
|
|
|
_getchar = function _gc2(x/*:number*/)/*:string*/ {
|
|
|
|
|
if(current_codepage === 1200) return String.fromCharCode(x);
|
2022-03-11 05:29:05 +00:00
|
|
|
|
return $cptable.utils.decode(current_codepage, [x&255,x>>8])[0];
|
2022-02-12 06:31:47 +00:00
|
|
|
|
};
|
|
|
|
|
_getansi = function _ga2(x/*:number*/)/*:string*/ {
|
2022-03-11 05:29:05 +00:00
|
|
|
|
return $cptable.utils.decode(current_ansi, [x])[0];
|
2022-02-12 06:31:47 +00:00
|
|
|
|
};
|
2022-02-13 09:35:34 +00:00
|
|
|
|
cpdoit();
|
2022-02-12 06:31:47 +00:00
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var DENSE = null;
|
|
|
|
|
var DIF_XL = true;
|
2022-03-22 20:08:08 +00:00
|
|
|
|
var Base64_map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
|
|
|
|
function Base64_encode(input) {
|
|
|
|
|
var o = "";
|
|
|
|
|
var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
|
|
|
|
|
for (var i = 0; i < input.length; ) {
|
|
|
|
|
c1 = input.charCodeAt(i++);
|
|
|
|
|
e1 = c1 >> 2;
|
|
|
|
|
c2 = input.charCodeAt(i++);
|
|
|
|
|
e2 = (c1 & 3) << 4 | c2 >> 4;
|
|
|
|
|
c3 = input.charCodeAt(i++);
|
|
|
|
|
e3 = (c2 & 15) << 2 | c3 >> 6;
|
|
|
|
|
e4 = c3 & 63;
|
|
|
|
|
if (isNaN(c2)) {
|
|
|
|
|
e3 = e4 = 64;
|
|
|
|
|
} else if (isNaN(c3)) {
|
|
|
|
|
e4 = 64;
|
2022-02-10 12:40:50 +00:00
|
|
|
|
}
|
2022-03-22 20:08:08 +00:00
|
|
|
|
o += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4);
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
2022-06-27 05:47:58 +00:00
|
|
|
|
function Base64_encode_pass(input) {
|
|
|
|
|
var o = "";
|
|
|
|
|
var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
|
|
|
|
|
for (var i = 0; i < input.length; ) {
|
|
|
|
|
c1 = input.charCodeAt(i++);
|
|
|
|
|
if (c1 > 255)
|
|
|
|
|
c1 = 95;
|
|
|
|
|
e1 = c1 >> 2;
|
|
|
|
|
c2 = input.charCodeAt(i++);
|
|
|
|
|
if (c2 > 255)
|
|
|
|
|
c2 = 95;
|
|
|
|
|
e2 = (c1 & 3) << 4 | c2 >> 4;
|
|
|
|
|
c3 = input.charCodeAt(i++);
|
|
|
|
|
if (c3 > 255)
|
|
|
|
|
c3 = 95;
|
|
|
|
|
e3 = (c2 & 15) << 2 | c3 >> 6;
|
|
|
|
|
e4 = c3 & 63;
|
|
|
|
|
if (isNaN(c2)) {
|
|
|
|
|
e3 = e4 = 64;
|
|
|
|
|
} else if (isNaN(c3)) {
|
|
|
|
|
e4 = 64;
|
|
|
|
|
}
|
|
|
|
|
o += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4);
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
2023-06-14 07:47:51 +00:00
|
|
|
|
function Base64_encode_arr(input) {
|
|
|
|
|
var o = "";
|
|
|
|
|
var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
|
|
|
|
|
for (var i = 0; i < input.length; ) {
|
|
|
|
|
c1 = input[i++];
|
|
|
|
|
e1 = c1 >> 2;
|
|
|
|
|
c2 = input[i++];
|
|
|
|
|
e2 = (c1 & 3) << 4 | c2 >> 4;
|
|
|
|
|
c3 = input[i++];
|
|
|
|
|
e3 = (c2 & 15) << 2 | c3 >> 6;
|
|
|
|
|
e4 = c3 & 63;
|
|
|
|
|
if (isNaN(c2)) {
|
|
|
|
|
e3 = e4 = 64;
|
|
|
|
|
} else if (isNaN(c3)) {
|
|
|
|
|
e4 = 64;
|
|
|
|
|
}
|
|
|
|
|
o += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4);
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
2022-03-22 20:08:08 +00:00
|
|
|
|
function Base64_decode(input) {
|
|
|
|
|
var o = "";
|
|
|
|
|
var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;
|
2024-04-05 01:20:28 +00:00
|
|
|
|
if (input.slice(0, 5) == "data:") {
|
|
|
|
|
var i = input.slice(0, 1024).indexOf(";base64,");
|
|
|
|
|
if (i > -1)
|
|
|
|
|
input = input.slice(i + 8);
|
|
|
|
|
}
|
|
|
|
|
input = input.replace(/[^\w\+\/\=]/g, "");
|
2022-03-22 20:08:08 +00:00
|
|
|
|
for (var i = 0; i < input.length; ) {
|
|
|
|
|
e1 = Base64_map.indexOf(input.charAt(i++));
|
|
|
|
|
e2 = Base64_map.indexOf(input.charAt(i++));
|
|
|
|
|
c1 = e1 << 2 | e2 >> 4;
|
|
|
|
|
o += String.fromCharCode(c1);
|
|
|
|
|
e3 = Base64_map.indexOf(input.charAt(i++));
|
|
|
|
|
c2 = (e2 & 15) << 4 | e3 >> 2;
|
|
|
|
|
if (e3 !== 64) {
|
|
|
|
|
o += String.fromCharCode(c2);
|
|
|
|
|
}
|
|
|
|
|
e4 = Base64_map.indexOf(input.charAt(i++));
|
|
|
|
|
c3 = (e3 & 3) << 6 | e4;
|
|
|
|
|
if (e4 !== 64) {
|
|
|
|
|
o += String.fromCharCode(c3);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var has_buf = /*#__PURE__*/(function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })();
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var Buffer_from = /*#__PURE__*/(function() {
|
|
|
|
|
if(typeof Buffer !== 'undefined') {
|
|
|
|
|
var nbfs = !Buffer.from;
|
|
|
|
|
if(!nbfs) try { Buffer.from("foo", "utf8"); } catch(e) { nbfs = true; }
|
|
|
|
|
return nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);
|
|
|
|
|
}
|
|
|
|
|
return function() {};
|
|
|
|
|
})();
|
2022-07-10 04:12:15 +00:00
|
|
|
|
var buf_utf16le = /*#__PURE__*/(function() {
|
|
|
|
|
if(typeof Buffer === 'undefined') return false;
|
|
|
|
|
var x = Buffer_from([65,0]);
|
|
|
|
|
if(!x) return false;
|
|
|
|
|
var o = x.toString("utf16le");
|
|
|
|
|
return o.length == 1;
|
|
|
|
|
})();
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function new_raw_buf(len/*:number*/) {
|
|
|
|
|
/* jshint -W056 */
|
2022-03-20 01:54:41 +00:00
|
|
|
|
if(has_buf) return Buffer.alloc ? Buffer.alloc(len) : new Buffer(len);
|
|
|
|
|
return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
/* jshint +W056 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function new_unsafe_buf(len/*:number*/) {
|
|
|
|
|
/* jshint -W056 */
|
2022-03-20 01:54:41 +00:00
|
|
|
|
if(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len);
|
|
|
|
|
return typeof Uint8Array != "undefined" ? new Uint8Array(len) : new Array(len);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
/* jshint +W056 */
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var s2a = function s2a(s/*:string*/)/*:any*/ {
|
|
|
|
|
if(has_buf) return Buffer_from(s, "binary");
|
|
|
|
|
return s.split("").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; });
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
function s2ab(s/*:string*/)/*:any*/ {
|
|
|
|
|
if(typeof ArrayBuffer === 'undefined') return s2a(s);
|
|
|
|
|
var buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);
|
|
|
|
|
for (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
|
|
|
|
|
return buf;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function a2s(data/*:any*/)/*:string*/ {
|
|
|
|
|
if(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join("");
|
|
|
|
|
var o/*:Array<string>*/ = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join("");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function a2u(data/*:Array<number>*/)/*:Uint8Array*/ {
|
|
|
|
|
if(typeof Uint8Array === 'undefined') throw new Error("Unsupported");
|
|
|
|
|
return new Uint8Array(data);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function ab2a(data/*:ArrayBuffer|Uint8Array*/)/*:Array<number>*/ {
|
|
|
|
|
if(typeof ArrayBuffer == 'undefined') throw new Error("Unsupported");
|
|
|
|
|
if(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));
|
|
|
|
|
/*:: if(data instanceof ArrayBuffer) throw new Error("unreachable"); */
|
|
|
|
|
var o = new Array(data.length);
|
|
|
|
|
for(var i = 0; i < data.length; ++i) o[i] = data[i];
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var bconcat = has_buf ? function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); } : function(bufs) {
|
|
|
|
|
if(typeof Uint8Array !== "undefined") {
|
|
|
|
|
var i = 0, maxlen = 0;
|
|
|
|
|
for(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;
|
|
|
|
|
var o = new Uint8Array(maxlen);
|
|
|
|
|
var len = 0;
|
|
|
|
|
for(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) {
|
|
|
|
|
len = bufs[i].length;
|
|
|
|
|
if(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen);
|
2022-09-22 09:05:24 +00:00
|
|
|
|
else if(typeof bufs[i] == "string") o.set(new Uint8Array(s2a(bufs[i])), maxlen);
|
2022-03-20 01:54:41 +00:00
|
|
|
|
else o.set(new Uint8Array(bufs[i]), maxlen);
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
return [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); }));
|
|
|
|
|
};
|
|
|
|
|
|
2022-02-10 12:40:50 +00:00
|
|
|
|
function utf8decode(content/*:string*/) {
|
2022-02-15 07:18:15 +00:00
|
|
|
|
var out = [], widx = 0, L = content.length + 250;
|
2022-02-10 12:40:50 +00:00
|
|
|
|
var o = new_raw_buf(content.length + 255);
|
|
|
|
|
for(var ridx = 0; ridx < content.length; ++ridx) {
|
|
|
|
|
var c = content.charCodeAt(ridx);
|
|
|
|
|
if(c < 0x80) o[widx++] = c;
|
|
|
|
|
else if(c < 0x800) {
|
|
|
|
|
o[widx++] = (192|((c>>6)&31));
|
|
|
|
|
o[widx++] = (128|(c&63));
|
|
|
|
|
} else if(c >= 0xD800 && c < 0xE000) {
|
|
|
|
|
c = (c&1023)+64;
|
2022-02-13 09:35:34 +00:00
|
|
|
|
var d = content.charCodeAt(++ridx)&1023;
|
2022-02-10 12:40:50 +00:00
|
|
|
|
o[widx++] = (240|((c>>8)&7));
|
|
|
|
|
o[widx++] = (128|((c>>2)&63));
|
|
|
|
|
o[widx++] = (128|((d>>6)&15)|((c&3)<<4));
|
|
|
|
|
o[widx++] = (128|(d&63));
|
|
|
|
|
} else {
|
|
|
|
|
o[widx++] = (224|((c>>12)&15));
|
|
|
|
|
o[widx++] = (128|((c>>6)&63));
|
|
|
|
|
o[widx++] = (128|(c&63));
|
|
|
|
|
}
|
2022-02-15 07:18:15 +00:00
|
|
|
|
if(widx > L) {
|
2022-02-10 12:40:50 +00:00
|
|
|
|
out.push(o.slice(0, widx));
|
|
|
|
|
widx = 0;
|
|
|
|
|
o = new_raw_buf(65535);
|
2022-02-15 07:18:15 +00:00
|
|
|
|
L = 65530;
|
2022-02-10 12:40:50 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
out.push(o.slice(0, widx));
|
|
|
|
|
return bconcat(out);
|
|
|
|
|
}
|
|
|
|
|
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var chr0 = /\u0000/g, chr1 = /[\u0001-\u0006]/g;
|
|
|
|
|
/*::
|
|
|
|
|
declare type Block = any;
|
|
|
|
|
declare type BufArray = {
|
|
|
|
|
newblk(sz:number):Block;
|
|
|
|
|
next(sz:number):Block;
|
|
|
|
|
end():any;
|
|
|
|
|
push(buf:Block):void;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
type RecordHopperCB = {(d:any, Rn:string, RT:number):?boolean;};
|
|
|
|
|
|
|
|
|
|
type EvertType = {[string]:string};
|
|
|
|
|
type EvertNumType = {[string]:number};
|
|
|
|
|
type EvertArrType = {[string]:Array<string>};
|
|
|
|
|
|
|
|
|
|
type StringConv = {(string):string};
|
|
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */
|
|
|
|
|
/*jshint -W041 */
|
|
|
|
|
function _strrev(x/*:string*/)/*:string*/ { var o = "", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }
|
|
|
|
|
function pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
|
|
|
|
function pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v;return t.length>=d?t:fill(' ',d-t.length)+t;}
|
|
|
|
|
function rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:t+fill(' ',d-t.length);}
|
|
|
|
|
function pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=""+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}
|
|
|
|
|
function pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=""+v; return t.length>=d?t:fill('0',d-t.length)+t;}
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var p2_32 = /*#__PURE__*/Math.pow(2,32);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
function pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }
|
2022-03-20 01:54:41 +00:00
|
|
|
|
/* yes, in 2022 this is still faster than string compare */
|
|
|
|
|
function SSF_isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var days/*:Array<Array<string> >*/ = [
|
|
|
|
|
['Sun', 'Sunday'],
|
|
|
|
|
['Mon', 'Monday'],
|
|
|
|
|
['Tue', 'Tuesday'],
|
|
|
|
|
['Wed', 'Wednesday'],
|
|
|
|
|
['Thu', 'Thursday'],
|
|
|
|
|
['Fri', 'Friday'],
|
|
|
|
|
['Sat', 'Saturday']
|
|
|
|
|
];
|
|
|
|
|
var months/*:Array<Array<string> >*/ = [
|
|
|
|
|
['J', 'Jan', 'January'],
|
|
|
|
|
['F', 'Feb', 'February'],
|
|
|
|
|
['M', 'Mar', 'March'],
|
|
|
|
|
['A', 'Apr', 'April'],
|
|
|
|
|
['M', 'May', 'May'],
|
|
|
|
|
['J', 'Jun', 'June'],
|
|
|
|
|
['J', 'Jul', 'July'],
|
|
|
|
|
['A', 'Aug', 'August'],
|
|
|
|
|
['S', 'Sep', 'September'],
|
|
|
|
|
['O', 'Oct', 'October'],
|
|
|
|
|
['N', 'Nov', 'November'],
|
|
|
|
|
['D', 'Dec', 'December']
|
|
|
|
|
];
|
2022-03-20 01:54:41 +00:00
|
|
|
|
function SSF_init_table(t/*:any*/) {
|
|
|
|
|
if(!t) t = {};
|
2021-09-12 11:11:48 +00:00
|
|
|
|
t[0]= 'General';
|
|
|
|
|
t[1]= '0';
|
|
|
|
|
t[2]= '0.00';
|
|
|
|
|
t[3]= '#,##0';
|
|
|
|
|
t[4]= '#,##0.00';
|
|
|
|
|
t[9]= '0%';
|
|
|
|
|
t[10]= '0.00%';
|
|
|
|
|
t[11]= '0.00E+00';
|
|
|
|
|
t[12]= '# ?/?';
|
|
|
|
|
t[13]= '# ??/??';
|
|
|
|
|
t[14]= 'm/d/yy';
|
|
|
|
|
t[15]= 'd-mmm-yy';
|
|
|
|
|
t[16]= 'd-mmm';
|
|
|
|
|
t[17]= 'mmm-yy';
|
|
|
|
|
t[18]= 'h:mm AM/PM';
|
|
|
|
|
t[19]= 'h:mm:ss AM/PM';
|
|
|
|
|
t[20]= 'h:mm';
|
|
|
|
|
t[21]= 'h:mm:ss';
|
|
|
|
|
t[22]= 'm/d/yy h:mm';
|
|
|
|
|
t[37]= '#,##0 ;(#,##0)';
|
|
|
|
|
t[38]= '#,##0 ;[Red](#,##0)';
|
|
|
|
|
t[39]= '#,##0.00;(#,##0.00)';
|
|
|
|
|
t[40]= '#,##0.00;[Red](#,##0.00)';
|
|
|
|
|
t[45]= 'mm:ss';
|
|
|
|
|
t[46]= '[h]:mm:ss';
|
|
|
|
|
t[47]= 'mmss.0';
|
|
|
|
|
t[48]= '##0.0E+0';
|
|
|
|
|
t[49]= '@';
|
|
|
|
|
t[56]= '"上午/下午 "hh"時"mm"分"ss"秒 "';
|
2022-03-20 01:54:41 +00:00
|
|
|
|
return t;
|
|
|
|
|
}
|
|
|
|
|
/* repeated to satiate webpack */
|
|
|
|
|
var table_fmt = {
|
|
|
|
|
0: 'General',
|
|
|
|
|
1: '0',
|
|
|
|
|
2: '0.00',
|
|
|
|
|
3: '#,##0',
|
|
|
|
|
4: '#,##0.00',
|
|
|
|
|
9: '0%',
|
|
|
|
|
10: '0.00%',
|
|
|
|
|
11: '0.00E+00',
|
|
|
|
|
12: '# ?/?',
|
|
|
|
|
13: '# ??/??',
|
|
|
|
|
14: 'm/d/yy',
|
|
|
|
|
15: 'd-mmm-yy',
|
|
|
|
|
16: 'd-mmm',
|
|
|
|
|
17: 'mmm-yy',
|
|
|
|
|
18: 'h:mm AM/PM',
|
|
|
|
|
19: 'h:mm:ss AM/PM',
|
|
|
|
|
20: 'h:mm',
|
|
|
|
|
21: 'h:mm:ss',
|
|
|
|
|
22: 'm/d/yy h:mm',
|
|
|
|
|
37: '#,##0 ;(#,##0)',
|
|
|
|
|
38: '#,##0 ;[Red](#,##0)',
|
|
|
|
|
39: '#,##0.00;(#,##0.00)',
|
|
|
|
|
40: '#,##0.00;[Red](#,##0.00)',
|
|
|
|
|
45: 'mm:ss',
|
|
|
|
|
46: '[h]:mm:ss',
|
|
|
|
|
47: 'mmss.0',
|
|
|
|
|
48: '##0.0E+0',
|
|
|
|
|
49: '@',
|
|
|
|
|
56: '"上午/下午 "hh"時"mm"分"ss"秒 "'
|
|
|
|
|
};
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
|
|
|
|
/* Defaults determined by systematically testing in Excel 2019 */
|
|
|
|
|
|
|
|
|
|
/* These formats appear to default to other formats in the table */
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var SSF_default_map = {
|
|
|
|
|
5: 37, 6: 38, 7: 39, 8: 40, // 5 -> 37 ... 8 -> 40
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
23: 0, 24: 0, 25: 0, 26: 0, // 23 -> 0 ... 26 -> 0
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
27: 14, 28: 14, 29: 14, 30: 14, 31: 14, // 27 -> 14 ... 31 -> 14
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
50: 14, 51: 14, 52: 14, 53: 14, 54: 14, // 50 -> 14 ... 58 -> 14
|
|
|
|
|
55: 14, 56: 14, 57: 14, 58: 14,
|
|
|
|
|
59: 1, 60: 2, 61: 3, 62: 4, // 59 -> 1 ... 62 -> 4
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
67: 9, 68: 10, // 67 -> 9 ... 68 -> 10
|
|
|
|
|
69: 12, 70: 13, 71: 14, // 69 -> 12 ... 71 -> 14
|
|
|
|
|
72: 14, 73: 15, 74: 16, 75: 17, // 72 -> 14 ... 75 -> 17
|
|
|
|
|
76: 20, 77: 21, 78: 22, // 76 -> 20 ... 78 -> 22
|
|
|
|
|
79: 45, 80: 46, 81: 47, // 79 -> 45 ... 81 -> 47
|
|
|
|
|
82: 0 // 82 -> 0 ... 65536 -> 0 (omitted)
|
|
|
|
|
};
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* These formats technically refer to Accounting formats with no equivalent */
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var SSF_default_str = {
|
2022-03-11 05:29:05 +00:00
|
|
|
|
// 5 -- Currency, 0 decimal, black negative
|
|
|
|
|
5: '"$"#,##0_);\\("$"#,##0\\)',
|
|
|
|
|
63: '"$"#,##0_);\\("$"#,##0\\)',
|
|
|
|
|
|
|
|
|
|
// 6 -- Currency, 0 decimal, red negative
|
|
|
|
|
6: '"$"#,##0_);[Red]\\("$"#,##0\\)',
|
|
|
|
|
64: '"$"#,##0_);[Red]\\("$"#,##0\\)',
|
|
|
|
|
|
|
|
|
|
// 7 -- Currency, 2 decimal, black negative
|
|
|
|
|
7: '"$"#,##0.00_);\\("$"#,##0.00\\)',
|
|
|
|
|
65: '"$"#,##0.00_);\\("$"#,##0.00\\)',
|
|
|
|
|
|
|
|
|
|
// 8 -- Currency, 2 decimal, red negative
|
|
|
|
|
8: '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
|
|
|
|
|
66: '"$"#,##0.00_);[Red]\\("$"#,##0.00\\)',
|
|
|
|
|
|
|
|
|
|
// 41 -- Accounting, 0 decimal, No Symbol
|
|
|
|
|
41: '_(* #,##0_);_(* \\(#,##0\\);_(* "-"_);_(@_)',
|
|
|
|
|
|
|
|
|
|
// 42 -- Accounting, 0 decimal, $ Symbol
|
|
|
|
|
42: '_("$"* #,##0_);_("$"* \\(#,##0\\);_("$"* "-"_);_(@_)',
|
|
|
|
|
|
|
|
|
|
// 43 -- Accounting, 2 decimal, No Symbol
|
|
|
|
|
43: '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* "-"??_);_(@_)',
|
|
|
|
|
|
|
|
|
|
// 44 -- Accounting, 2 decimal, $ Symbol
|
|
|
|
|
44: '_("$"* #,##0.00_);_("$"* \\(#,##0.00\\);_("$"* "-"??_);_(@_)'
|
|
|
|
|
};
|
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
function SSF_frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array<number>*/ {
|
2021-09-12 11:11:48 +00:00
|
|
|
|
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 = Math.floor(B);
|
|
|
|
|
while(Q_1 < D) {
|
|
|
|
|
A = Math.floor(B);
|
|
|
|
|
P = A * P_1 + P_2;
|
|
|
|
|
Q = A * Q_1 + Q_2;
|
|
|
|
|
if((B - A) < 0.00000005) break;
|
|
|
|
|
B = 1 / (B - A);
|
|
|
|
|
P_2 = P_1; P_1 = P;
|
|
|
|
|
Q_2 = Q_1; Q_1 = Q;
|
|
|
|
|
}
|
|
|
|
|
if(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }
|
|
|
|
|
if(!mixed) return [0, sgn * P, Q];
|
|
|
|
|
var q = Math.floor(sgn * P/Q);
|
|
|
|
|
return [q, sgn*P - q*Q, Q];
|
|
|
|
|
}
|
2023-12-05 08:19:42 +00:00
|
|
|
|
function SSF_normalize_xl_unsafe(v/*:number*/)/*:number*/ {
|
|
|
|
|
var s = v.toPrecision(16);
|
|
|
|
|
if(s.indexOf("e") > -1) {
|
|
|
|
|
var m = s.slice(0, s.indexOf("e"));
|
|
|
|
|
m = m.indexOf(".") > -1 ? m.slice(0, (m.slice(0,2) == "0." ? 17 : 16)) : (m.slice(0,15) + fill("0", m.length - 15));
|
|
|
|
|
return m + s.slice(s.indexOf("e"));
|
|
|
|
|
}
|
|
|
|
|
var n = s.indexOf(".") > -1 ? s.slice(0, (s.slice(0,2) == "0." ? 17 : 16)) : (s.slice(0,15) + fill("0", s.length - 15));
|
|
|
|
|
return Number(n);
|
|
|
|
|
}
|
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
function SSF_parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {
|
2021-09-12 11:11:48 +00:00
|
|
|
|
if(v > 2958465 || v < 0) return null;
|
2023-12-05 08:19:42 +00:00
|
|
|
|
v = SSF_normalize_xl_unsafe(v);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;
|
|
|
|
|
var dout=[];
|
|
|
|
|
var out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};
|
|
|
|
|
if(Math.abs(out.u) < 1e-6) out.u = 0;
|
|
|
|
|
if(opts && opts.date1904) date += 1462;
|
|
|
|
|
if(out.u > 0.9999) {
|
|
|
|
|
out.u = 0;
|
|
|
|
|
if(++time == 86400) { out.T = time = 0; ++date; ++out.D; }
|
|
|
|
|
}
|
|
|
|
|
if(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}
|
|
|
|
|
else if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}
|
|
|
|
|
else {
|
|
|
|
|
if(date > 60) --date;
|
|
|
|
|
/* 1 = Jan 1 1900 in Gregorian */
|
|
|
|
|
var d = new Date(1900, 0, 1);
|
|
|
|
|
d.setDate(d.getDate() + date - 1);
|
|
|
|
|
dout = [d.getFullYear(), d.getMonth()+1,d.getDate()];
|
|
|
|
|
dow = d.getDay();
|
|
|
|
|
if(date < 60) dow = (dow + 6) % 7;
|
2022-03-20 01:54:41 +00:00
|
|
|
|
if(b2) dow = SSF_fix_hijri(d, dout);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
}
|
|
|
|
|
out.y = dout[0]; out.m = dout[1]; out.d = dout[2];
|
|
|
|
|
out.S = time % 60; time = Math.floor(time / 60);
|
|
|
|
|
out.M = time % 60; time = Math.floor(time / 60);
|
|
|
|
|
out.H = time;
|
|
|
|
|
out.q = dow;
|
|
|
|
|
return out;
|
|
|
|
|
}
|
|
|
|
|
/* ECMA-376 18.8.30 numFmt*/
|
|
|
|
|
/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */
|
2022-03-20 01:54:41 +00:00
|
|
|
|
/* exponent >= -9 and <= 9 */
|
|
|
|
|
function SSF_strip_decimal(o/*:string*/)/*:string*/ {
|
|
|
|
|
return (o.indexOf(".") == -1) ? o : o.replace(/(?:\.0*|(\.\d*[1-9])0+)$/, "$1");
|
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
/* General Exponential always shows 2 digits exp and trims the mantissa */
|
|
|
|
|
function SSF_normalize_exp(o/*:string*/)/*:string*/ {
|
|
|
|
|
if(o.indexOf("E") == -1) return o;
|
|
|
|
|
return o.replace(/(?:\.0*|(\.\d*[1-9])0+)[Ee]/,"$1E").replace(/(E[+-])(\d)$/,"$10$2");
|
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
/* exponent >= -9 and <= 9 */
|
|
|
|
|
function SSF_small_exp(v/*:number*/)/*:string*/ {
|
|
|
|
|
var w = (v<0?12:11);
|
|
|
|
|
var o = SSF_strip_decimal(v.toFixed(12)); if(o.length <= w) return o;
|
|
|
|
|
o = v.toPrecision(10); if(o.length <= w) return o;
|
|
|
|
|
return v.toExponential(5);
|
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
/* exponent >= 11 or <= -10 likely exponential */
|
|
|
|
|
function SSF_large_exp(v/*:number*/)/*:string*/ {
|
|
|
|
|
var o = SSF_strip_decimal(v.toFixed(11));
|
|
|
|
|
return (o.length > (v<0?12:11) || o === "0" || o === "-0") ? v.toPrecision(6) : o;
|
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
function SSF_general_num(v/*:number*/)/*:string*/ {
|
2024-07-04 19:54:34 +00:00
|
|
|
|
if(!isFinite(v)) return isNaN(v) ? "#NUM!" : "#DIV/0!";
|
2022-03-20 01:54:41 +00:00
|
|
|
|
var V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
if(V >= -4 && V <= -1) o = v.toPrecision(10+V);
|
|
|
|
|
else if(Math.abs(V) <= 9) o = SSF_small_exp(v);
|
|
|
|
|
else if(V === 10) o = v.toFixed(10).substr(0,12);
|
|
|
|
|
else o = SSF_large_exp(v);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
return SSF_strip_decimal(SSF_normalize_exp(o.toUpperCase()));
|
|
|
|
|
}
|
2021-09-12 11:11:48 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
"General" rules:
|
|
|
|
|
- text is passed through ("@")
|
|
|
|
|
- booleans are rendered as TRUE/FALSE
|
|
|
|
|
- "up to 11 characters" displayed for numbers
|
|
|
|
|
- Default date format (code 14) used for Dates
|
|
|
|
|
|
2022-03-20 01:54:41 +00:00
|
|
|
|
The longest 32-bit integer text is "-2147483648", exactly 11 chars
|
2021-09-12 11:11:48 +00:00
|
|
|
|
TODO: technically the display depends on the width of the cell
|
|
|
|
|
*/
|
2022-03-20 01:54:41 +00:00
|
|
|
|
function SSF_general(v/*:any*/, opts/*:any*/) {
|
2021-09-12 11:11:48 +00:00
|
|
|
|
switch(typeof v) {
|
|
|
|
|
case 'string': return v;
|
|
|
|
|
case 'boolean': return v ? "TRUE" : "FALSE";
|
2022-03-20 01:54:41 +00:00
|
|
|
|
case 'number': return (v|0) === v ? v.toString(10) : SSF_general_num(v);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
case 'undefined': return "";
|
|
|
|
|
case 'object':
|
|
|
|
|
if(v == null) return "";
|
2023-06-23 09:48:47 +00:00
|
|
|
|
if(v instanceof Date) return SSF_format(14, datenum(v, opts && opts.date1904), opts);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
}
|
|
|
|
|
throw new Error("unsupported value in General format: " + v);
|
|
|
|
|
}
|
2022-03-20 01:54:41 +00:00
|
|
|
|
|
|
|
|
|
function SSF_fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {
|
2021-09-12 11:11:48 +00:00
|
|
|
|
/* TODO: properly adjust y/m/d and */
|
|
|
|
|
o[0] -= 581;
|
|
|
|
|
var dow = date.getDay();
|
|
|
|
|
if(date < 60) dow = (dow + 6) % 7;
|
|
|
|
|
return dow;
|
|
|
|
|
}
|
|
|
|
|
//var THAI_DIGITS = "\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59".split("");
|
2022-03-20 01:54:41 +00:00
|
|
|
|
function SSF_write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ {
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var o="", ss=0, tt=0, y = val.y, out, outl = 0;
|
|
|
|
|
switch(type) {
|
|
|
|
|
case 98: /* 'b' buddhist year */
|
|
|
|
|
y = val.y + 543;
|
|
|
|
|
/* falls through */
|
|
|
|
|
case 121: /* 'y' year */
|
|
|
|
|
switch(fmt.length) {
|
|
|
|
|
case 1: case 2: out = y % 100; outl = 2; break;
|
|
|
|
|
default: out = y % 10000; outl = 4; break;
|
|
|
|
|
} break;
|
|
|
|
|
case 109: /* 'm' month */
|
|
|
|
|
switch(fmt.length) {
|
|
|
|
|
case 1: case 2: out = val.m; outl = fmt.length; break;
|
|
|
|
|
case 3: return months[val.m-1][1];
|
|
|
|
|
case 5: return months[val.m-1][0];
|
|
|
|
|
default: return months[val.m-1][2];
|
|
|
|
|
} break;
|
|
|
|
|
case 100: /* 'd' day */
|
|
|
|
|
switch(fmt.length) {
|
|
|
|
|
case 1: case 2: out = val.d; outl = fmt.length; break;
|
|
|
|
|
case 3: return days[val.q][0];
|
|
|
|
|
default: return days[val.q][1];
|
|
|
|
|
} break;
|
|
|
|
|
case 104: /* 'h' 12-hour */
|
|
|
|
|
switch(fmt.length) {
|
|
|
|
|
case 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;
|
|
|
|
|
default: throw 'bad hour format: ' + fmt;
|
|
|
|
|
} break;
|
|
|
|
|
case 72: /* 'H' 24-hour */
|
|
|
|
|
switch(fmt.length) {
|
|
|
|
|
case 1: case 2: out = val.H; outl = fmt.length; break;
|
|
|
|
|
default: throw 'bad hour format: ' + fmt;
|
|
|
|
|
} break;
|
|
|
|
|
case 77: /* 'M' minutes */
|
|
|
|
|
switch(fmt.length) {
|
|
|
|
|
case 1: case 2: out = val.M; outl = fmt.length; break;
|
|
|
|
|
default: throw 'bad minute format: ' + fmt;
|
|
|
|
|
} break;
|
|
|
|
|
case 115: /* 's' seconds */
|
|
|
|
|
if(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;
|
|
|
|
|
if(val.u === 0 && (fmt == "s" || fmt == "ss")) return pad0(val.S, fmt.length);
|
|
|
|
|
/*::if(!ss0) ss0 = 0; */
|
|
|
|
|
if(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;
|
|
|
|
|
else tt = ss0 === 1 ? 10 : 1;
|
|
|
|
|
ss = Math.round((tt)*(val.S + val.u));
|
|
|
|
|
if(ss >= 60*tt) ss = 0;
|
|
|
|
|
if(fmt === 's') return ss === 0 ? "0" : ""+ss/tt;
|
|
|
|
|
o = pad0(ss,2 + ss0);
|
|
|
|
|
if(fmt === 'ss') return o.substr(0,2);
|
|
|
|
|
return "." + o.substr(2,fmt.length-1);
|
|
|
|
|
case 90: /* 'Z' absolute time */
|
|
|
|
|
switch(fmt) {
|
|
|
|
|
case '[h]': case '[hh]': out = val.D*24+val.H; break;
|
|
|
|
|
case '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;
|
2023-12-05 08:19:42 +00:00
|
|
|
|
case '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+(ss0 == 0 ? Math.round(val.S+val.u) : val.S); break;
|
2021-09-12 11:11:48 +00:00
|
|
|
|
default: throw 'bad abstime format: ' + fmt;
|
|
|
|
|
} outl = fmt.length === 3 ? 1 : 2; break;
|
|
|
|
|
case 101: /* 'e' era */
|
|
|
|
|
out = y; outl = 1; break;
|
|
|
|
|
}
|
|
|
|
|
var outstr = outl > 0 ? pad0(out, outl) : "";
|
|
|
|
|
return outstr;
|
|
|
|
|
}
|
2022-03-20 01:54:41 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*jshint -W086 */
|
2021-09-12 11:11:48 +00:00
|
|
|
|
/*jshint +W086 */
|
|
|
|
|
function commaify(s/*:string*/)/*:string*/ {
|
|
|
|
|
var w = 3;
|
|
|
|
|
if(s.length <= w) return s;
|
|
|
|
|
var j = (s.length % w), o = s.substr(0,j);
|
|
|
|
|
for(; j!=s.length; j+=w) o+=(o.length > 0 ? "," : "") + s.substr(j,w);
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
var pct1 = /%/g;
|
|
|
|
|
function write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
|
|
|
|
var sfmt = fmt.replace(pct1,""), mul = fmt.length - sfmt.length;
|
|
|
|
|
return write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill("%",mul);
|
|
|
|
|
}
|
2022-03-20 01:54:41 +00:00
|
|
|
|
|
2021-09-12 11:11:48 +00:00
|
|
|
|
function write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{
|
|
|
|
|
var idx = fmt.length - 1;
|
|
|
|
|
while(fmt.charCodeAt(idx-1) === 44) --idx;
|
|
|
|
|
return write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));
|
|
|
|
|
}
|
2022-03-20 01:54:41 +00:00
|
|
|
|
|
2021-09-12 11:11:48 +00:00
|
|
|
|
function write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{
|
|
|
|
|
var o/*:string*/;
|
|
|
|
|
var idx = fmt.indexOf("E") - fmt.indexOf(".") - 1;
|
|
|
|
|
if(fmt.match(/^#+0.0E\+0$/)) {
|
|
|
|
|
if(val == 0) return "0.0E+0";
|
|
|
|
|
else if(val < 0) return "-" + write_num_exp(fmt, -val);
|
|
|
|
|
var period = fmt.indexOf("."); if(period === -1) period=fmt.indexOf('E');
|
|
|
|
|
var ee = Math.floor(Math.log(val)*Math.LOG10E)%period;
|
|
|
|
|
if(ee < 0) ee += period;
|
|
|
|
|
o = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);
|
|
|
|
|
if(o.indexOf("e") === -1) {
|
|
|
|
|
var fakee = Math.floor(Math.log(val)*Math.LOG10E);
|
|
|
|
|
if(o.indexOf(".") === -1) o = o.charAt(0) + "." + o.substr(1) + "E+" + (fakee - o.length+ee);
|
|
|
|
|
else o += "E+" + (fakee - ee);
|
|
|
|
|
while(o.substr(0,2) === "0.") {
|
|
|
|
|
o = o.charAt(0) + o.substr(2,period) + "." + o.substr(2+period);
|
|
|
|
|
o = o.replace(/^0+([1-9])/,"$1").replace(/^0+\./,"0.");
|
|
|
|
|
}
|
|
|
|
|
o = o.replace(/\+-/,"-");
|
|
|
|
|
}
|
|
|
|
|
o = o.replace(/^([+-]?)(\d*)\.(\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + "." + $3.substr(ee) + "E"; });
|
|
|
|
|
} else o = val.toExponential(idx);
|
|
|
|
|
if(fmt.match(/E\+00$/) && o.match(/e[+-]\d$/)) o = o.substr(0,o.length-1) + "0" + o.charAt(o.length-1);
|
|
|
|
|
if(fmt.match(/E\-/) && o.match(/e\+/)) o = o.replace(/e\+/,"e");
|
|
|
|
|
return o.replace("e","E");
|
|
|
|
|
}
|
|
|
|
|
var frac1 = /# (\?+)( ?)\/( ?)(\d+)/;
|
|
|
|
|
function write_num_f1(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ {
|
|
|
|
|
var den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);
|
|
|
|
|
var myn = (rr - base*den), myd = den;
|
|
|
|
|
return sign + (base === 0 ? "" : ""+base) + " " + (myn === 0 ? fill(" ", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + "/" + r[3] + pad0(myd,r[4].length));
|
|
|
|
|
}
|
|
|
|
|
function write_num_f2(r/*:Array<string>*/, aval/*:number*/, sign/*:string*/)/*:string*/ {
|
|
|
|
|
return sign + (aval === 0 ? "" : ""+aval) + fill(" ", r[1].length + 2 + r[4].length);
|
|
|
|
|
}
|
|
|
|
|
var dec1 = /^#*0*\.([0#]+)/;
|
2024-04-05 01:20:28 +00:00
|
|
|
|
var closeparen = /\)[^)]*[0#]/;
|
2021-09-12 11:11:48 +00:00
|
|
|
|
var phone = /\(###\) ###\\?-####/;
|
|
|
|
|
function hashq(str/*:string*/)/*:string*/ {
|
|
|
|
|
var o = "", cc;
|
|
|
|
|
for(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {
|
|
|
|
|
case 35: break;
|
|
|
|
|
case 63: o+= " "; break;
|
|
|
|
|
case 48: o+= "0"; break;
|
|
|
|
|
default: o+= String.fromCharCode(cc);
|
|
|
|
|
}
|
|
|
|
|
return o;
|
|
|
|
|
}
|
|
|
|
|
function rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return ""+(Math.round(val * dd)/dd); }
|
|
|
|
|
function dec(val/*:number*/, d/*:number*/)/*:number*/ {
|
|
|
|
|
var _frac = val - Math.floor(val), dd = Math.pow(10,d);
|
|
|
|
|
if (d < ('' + Math.round(_frac * dd)).length) return 0;
|
|
|
|
|
return Math.round(_frac * dd);
|
|
|
|
|
}
|
|
|
|
|
function carry(val/*:number*/, d/*:number*/)/*:number*/ {
|
|
|
|
|
if (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
function flr(val/*:number*/)/*:string*/ {
|
|
|
|
|
if(val < 2147483647 && val > -2147483648) return ""+(val >= 0 ? (val|0) : (val-1|0));
|
|
|
|
|
return ""+Math.floor(val);
|
|
|
|
|
}
|
|
|
|
|
function write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {
|
|
|
|
|
if(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {
|
|
|
|
|
var ffmt = fmt.replace(/\( */,"").replace(/ \)/,"").replace(/\)/,"");
|
|
|
|
|
if(val >= 0) return write_num_flt('n', ffmt, val);
|
|
|
|
|
return '(' + write_num_flt('n', ffmt, -val) + ')';
|
|
|
|
|
}
|
|
|
|
|
if(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);
|
|
|
|
|
if(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);
|
|
|
|
|
if(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);
|
|
|
|
|
if(fmt.charCodeAt(0) === 36) return "$"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);
|
|
|
|
|
var o;
|
|
|
|
|
var r/*:?Array<string>*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? "-" : "";
|
|
|
|
|
if(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);
|
|
|
|
|
if(fmt.match(/^[#?]+$/)) {
|
|
|
|
|
o = pad0r(val,0); if(o === "0") o = "";
|
|
|
|
|
return o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;
|
|
|
|
|
}
|
|
|
|
|
if((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);
|
|
|
|
|
if(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf("0"));
|
|
|
|
|
if((r = fmt.match(dec1))) {
|
|
|
|
|
o = rnd(val, r[1].length).replace(/^([^\.]+)$/,"$1."+hashq(r[1])).replace(/\.$/,"."+hashq(r[1])).replace(/\.(\d*)$/,function($$, $1) { return "." + $1 + fill("0", hashq(/*::(*/r/*::||[""])*/[1]).length-$1.length); });
|
|
|
|
|
return fmt.indexOf("0.") !== -1 ? o : o.replace(/^0\./,".");
|
|
|
|
|
}
|
|
|
|
|
fmt = fmt.replace(/^#+([0.])/, "$1");
|
|
|
|
|
if((r = fmt.match(/^(0*)\.(#*)$/))) {
|
|
|
|
|
return sign + rnd(aval, r[2].length).replace(/\.(\d*[1-9])0*$/,".$1").replace(/^(-?\d*)$/,"$1.").replace(/^0\./,r[1].length?"0.":".");
|
|
|
|
|
}
|
|
|
|
|
if((r = fmt.match(/^#{1,3},##0(\.?)$/))) return sign + commaify(pad0r(aval,0));
|
|
|
|
|
if((r = fmt.match(/^#,##0\.([#0]*0)$/))) {
|
|
|
|
|
return val < 0 ? "-" + write_num_flt(type, fmt, -val) : commaify(""+(Math.floor(val) + carry(val, r[1].length))) + "." + pad0(dec(val, r[1].length),r[1].length);
|
|
|
|
|
}
|
|
|
|
|
if((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,""),val);
|
|
|
|
|
if((r = fmt.match(/^([0#]+)(\\?-([0#]+))+$/))) {
|
|
|
|
|
o = _strrev(write_num_flt(type, fmt.replace(/[\\-]/g,""), val));
|
|
|
|
|
ri = 0;
|
|
|
|
|
return _strrev(_strrev(fmt.replace(/\\/g,"")).replace(/[0#]/g,function(x){return ri<o.length?o.charAt(ri++):x==='0'?'0':"";}));
|
|
|
|
|
}
|
|
|
|
|
if(fmt.match(phone)) {
|
|
|
|
|
o = write_num_flt(type, "##########", val);
|
|
|
|
|
return "(" + o.substr(0,3) + ") " + o.substr(3, 3) + "-" + o.substr(6);
|
|
|
|
|
}
|
|
|
|
|
var oa = "";
|
|
|
|
|
if((r = fmt.match(/^([#0?]+)( ?)\/( ?)([#0?]+)/))) {
|
|
|
|
|
ri = Math.min(/*::String(*/r[4]/*::)*/.length,7);
|
2022-03-20 01:54:41 +00:00
|
|
|
|
ff = SSF_frac(aval, Math.pow(10,ri)-1, false);
|
2021-09-12 11:11:48 +00:00
|
|
|
|
o = "" + sign;
|
|
|
|
|
oa = write_num("n", /*::String(*/r[1]/*::)*/, ff[1]);
|
|
|
|
|
if(oa.charAt(oa.length-1) == " ") oa = oa.substr(0,oa.length-1) + "0";
|
|
|
|
|
o += oa + /*::String(*/r[2]/*::)*/ + "/" + /*::String(*/r[3]/*::)*/;
|
|
|
|
|
oa = rpad_(ff[2],ri);
|
|
|
|
|
if(oa.length < r[4].length) oa = hashq(r[4].substr(r[4].length-oa.length)) + oa;
|
|
|
|
|
o += oa;
|
|
|
|
|
return o;
|
|