forked from sheetjs/sheetjs
		
	version bump 0.6.3: B2 stubs, b format
- B2 hijri stubs (TODO: find the algorithm) - b* correspond to the equivalent year in buddhist calendar
This commit is contained in:
		
							parent
							
								
									95b338304b
								
							
						
					
					
						commit
						be19bcd01e
					
				| @ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "ssf", | ||||
|   "version": "0.6.2", | ||||
|   "version": "0.6.3", | ||||
|   "author": "SheetJS", | ||||
|   "description": "pure-JS library to format data using ECMA-376 spreadsheet Format Codes", | ||||
|   "keywords": [ "format", "sprintf", "spreadsheet" ], | ||||
|  | ||||
							
								
								
									
										45
									
								
								ssf.js
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										45
									
								
								ssf.js
									
									
									
									
									
								
							| @ -5,14 +5,13 @@ var _strrev = function(x) { return String(x).split("").reverse().join("");}; | ||||
| function fill(c,l) { return new Array(l+1).join(c); } | ||||
| 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));} | ||||
| SSF.version = '0.6.2'; | ||||
| SSF.version = '0.6.3'; | ||||
| /* Options */ | ||||
| var opts_fmt = {}; | ||||
| function fixopts(o){for(var y in opts_fmt) if(o[y]===undefined) o[y]=opts_fmt[y];} | ||||
| SSF.opts = opts_fmt; | ||||
| opts_fmt.date1904 = 0; | ||||
| opts_fmt.output = ""; | ||||
| opts_fmt.mode = ""; | ||||
| var table_fmt = { | ||||
|   0:  'General', | ||||
|   1:  '0', | ||||
| @ -115,7 +114,8 @@ var general_fmt = function(v) { | ||||
|   throw new Error("unsupported value in General format: " + v); | ||||
| }; | ||||
| SSF._general = general_fmt; | ||||
| var parse_date_code = function parse_date_code(v,opts) { | ||||
| function fix_hijri(date, o) { } | ||||
| var parse_date_code = function parse_date_code(v,opts,b2) { | ||||
|   var date = Math.floor(v), time = Math.floor(86400 * (v - date)+1e-6), dow=0; | ||||
|   var dout=[], out={D:date, T:time, u:86400*(v-date)-time}; fixopts(opts = (opts||{})); | ||||
|   if(opts.date1904) date += 1462; | ||||
| @ -124,8 +124,8 @@ var parse_date_code = function parse_date_code(v,opts) { | ||||
|     out.u = 0; | ||||
|     if(++time == 86400) { time = 0; ++date; } | ||||
|   } | ||||
|   if(date === 60) {dout = [1900,2,29]; dow=3;} | ||||
|   else if(date === 0) {dout = [1900,1,0]; dow=6;} | ||||
|   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 */ | ||||
| @ -133,7 +133,8 @@ var parse_date_code = function parse_date_code(v,opts) { | ||||
|     d.setDate(d.getDate() + date - 1); | ||||
|     dout = [d.getFullYear(), d.getMonth()+1,d.getDate()]; | ||||
|     dow = d.getDay(); | ||||
|     if(/* opts.mode === 'excel' && */ date < 60) dow = (dow + 6) % 7; | ||||
|     if(date < 60) dow = (dow + 6) % 7; | ||||
|     if(b2) dow = fix_hijri(d, dout); | ||||
|   } | ||||
|   out.y = dout[0]; out.m = dout[1]; out.d = dout[2]; | ||||
|   out.S = time % 60; time = Math.floor(time / 60); | ||||
| @ -146,13 +147,15 @@ SSF.parse_date_code = parse_date_code; | ||||
| /*jshint -W086 */ | ||||
| var write_date = function(type, fmt, val) { | ||||
|   if(val < 0) return ""; | ||||
|   var o, ss; | ||||
|   var o, ss, y = val.y; | ||||
|   switch(type) { | ||||
|     case 'y': switch(fmt) { /* year */ | ||||
|       case 'y': case 'yy': return pad(val.y % 100,2); | ||||
|       default: return pad(val.y % 10000,4); | ||||
|     case 'b': y = val.y + 543; | ||||
|       /* falls through */ | ||||
|     case 'y': switch(fmt.length) { /* year */ | ||||
|       case 1: case 2: return pad(y % 100,2); | ||||
|       default: return pad(y % 10000,4); | ||||
|     } | ||||
|     case 'm': switch(fmt) { /* month */ | ||||
|     case 'm': switch(fmt) { | ||||
|       case 'm': return val.m; | ||||
|       case 'mm': return pad(val.m,2); | ||||
|       case 'mmm': return months[val.m-1][1]; | ||||
| @ -317,7 +320,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|   while(i < fmt.length) { | ||||
|     switch((c = fmt[i])) { | ||||
|       case 'G': /* General */ | ||||
|         if(fmt.substr(i, i+6).toLowerCase() !== "general") | ||||
|         if(fmt.substr(i, 7).toLowerCase() !== "general") | ||||
|           throw new Error('unrecognized character ' + fmt[i] + ' in ' +fmt); | ||||
|         out.push({t:'G',v:'General'}); i+=7; break; | ||||
|       case '"': /* Literal text */ | ||||
| @ -328,7 +331,12 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|       case '_': out.push({t:'t', v:" "}); i+=2; break; | ||||
|       case '@': /* Text Placeholder */ | ||||
|         out.push({t:'T', v:v}); ++i; break; | ||||
|       /* Dates */ | ||||
|       case 'B': case 'b': | ||||
|         if(fmt[i+1] === "1" || fmt[i+1] === "2") { | ||||
|           if(!dt) dt = parse_date_code(v, opts, fmt[i+1] === "2"); | ||||
|           q={t:'X', v:fmt.substr(i,2)}; out.push(q); lst = c; i+=2; break; | ||||
|         } | ||||
|         /* falls through */ | ||||
|       case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
|         c = c.toLowerCase(); | ||||
|         /* falls through */ | ||||
| @ -350,7 +358,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|         else if(fmt.substr(i,5) === "AM/PM") { q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } | ||||
|         else { q.t = "t"; i++; } | ||||
|         out.push(q); lst = c; break; | ||||
|       case '[': /* TODO: Fix this -- ignore all conditionals and formatting */ | ||||
|       case '[': | ||||
|         o = c; | ||||
|         while(fmt[i++] !== ']' && i < fmt.length) o += fmt[i]; | ||||
|         if(o.substr(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; | ||||
| @ -374,7 +382,7 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|         out.push({t:'D', v:o}); break; | ||||
|       case ' ': out.push({t:c,v:c}); ++i; break; | ||||
|       default: | ||||
|         if(",$-+/():!^&'~{}<>=€".indexOf(c) === -1) | ||||
|         if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c) === -1) | ||||
|           throw 'unrecognized character ' + fmt[i] + ' in ' + fmt; | ||||
|         out.push({t:'t', v:c}); ++i; break; | ||||
|     } | ||||
| @ -387,6 +395,8 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|       /* falls through */ | ||||
|       case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; | ||||
|       case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; | ||||
|       case 'X': if(out[i].v === "B2"); | ||||
|         break; | ||||
|       case 'Z': | ||||
|         if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; | ||||
|         if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; | ||||
| @ -409,8 +419,9 @@ function eval_fmt(fmt, v, opts, flen) { | ||||
|   for(i=0; i < out.length; ++i) { | ||||
|     switch(out[i].t) { | ||||
|       case 't': case 'T': case ' ': case 'D': break; | ||||
|       case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'Z': | ||||
|         out[i].v = write_date(out[i].t, out[i].v, dt, bt); | ||||
|       case 'X': delete out[i]; break; | ||||
|       case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': | ||||
|         out[i].v = write_date(out[i].t, out[i].v, dt); | ||||
|         out[i].t = 't'; break; | ||||
|       case 'n': case '(': case '?': | ||||
|         var jj = i+1; | ||||
|  | ||||
							
								
								
									
										88
									
								
								ssf.md
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										88
									
								
								ssf.md
									
									
									
									
									
								
							| @ -39,19 +39,6 @@ control the output, set the `output` variable: | ||||
| opts_fmt.output = ""; | ||||
| ``` | ||||
| 
 | ||||
| There are a few places where the specification is ambiguous or where Excel does | ||||
| not follow the spec.  They are noted in the document. | ||||
| 
 | ||||
| The `mode` option controls compatibility: | ||||
| 
 | ||||
| - `ssf`: options that the author believes makes the most sense (default) | ||||
| - `ecma`: compatibility with ECMA-376 | ||||
| - `excel`: compatibility with MS-XLSX | ||||
| 
 | ||||
| ``` | ||||
| opts_fmt.mode = ""; | ||||
| ``` | ||||
| 
 | ||||
| ## Conditional Format Codes | ||||
| 
 | ||||
| The specification is a bit unclear here.  It initially claims in §18.3.1: | ||||
| @ -273,9 +260,10 @@ Most spreadsheet formats store dates and times as floating point numbers (where | ||||
| the integer part is a day code based on a format and the fractional part is the | ||||
| portion of a 24 hour day). | ||||
| 
 | ||||
| Excel supports the alternative Hijri calendar (indicated with `b2`): | ||||
| 
 | ||||
| ```js>tmp/50_date.js | ||||
| var parse_date_code = function parse_date_code(v,opts) { | ||||
| var parse_date_code = function parse_date_code(v,opts,b2) { | ||||
|   var date = Math.floor(v), time = Math.floor(86400 * (v - date)+1e-6), dow=0; | ||||
|   var dout=[], out={D:date, T:time, u:86400*(v-date)-time}; fixopts(opts = (opts||{})); | ||||
| ``` | ||||
| @ -310,8 +298,8 @@ February 29, 1900 (date `60`) is recognized as a Wednesday.  Date `0` is treated | ||||
| as January 0, 1900 rather than December 31, 1899. | ||||
| 
 | ||||
| ``` | ||||
|   if(date === 60) {dout = [1900,2,29]; dow=3;} | ||||
|   else if(date === 0) {dout = [1900,1,0]; dow=6;} | ||||
|   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;} | ||||
| ``` | ||||
| 
 | ||||
| For the other dates, using the JS date mechanism suffices. | ||||
| @ -333,7 +321,13 @@ Saturday.  The "right" thing to do is to keep the DOW consistent and just break | ||||
| the fact that there are two Wednesdays in that "week". | ||||
| 
 | ||||
| ``` | ||||
|     if(/* opts.mode === 'excel' && */ date < 60) dow = (dow + 6) % 7; | ||||
|     if(date < 60) dow = (dow + 6) % 7; | ||||
| ``` | ||||
| 
 | ||||
| For the hijri calendar, the date needs to be fixed | ||||
| 
 | ||||
| ``` | ||||
|     if(b2) dow = fix_hijri(d, dout); | ||||
|   } | ||||
| ``` | ||||
| 
 | ||||
| @ -350,6 +344,12 @@ Because JS dates cannot represent the bad leap day, this returns an object: | ||||
| SSF.parse_date_code = parse_date_code; | ||||
| ``` | ||||
| 
 | ||||
| TODO: suitable hijri correction | ||||
| 
 | ||||
| ```js>tmp/45_hijri.js | ||||
| function fix_hijri(date, o) { } | ||||
| ``` | ||||
| 
 | ||||
| ## Evaluating Number Formats | ||||
| 
 | ||||
| ```js>tmp/60_number.js | ||||
| @ -547,7 +547,7 @@ LO Formats sometimes leak "GENERAL" or "General" to stand for general format: | ||||
| 
 | ||||
| ``` | ||||
|       case 'G': /* General */ | ||||
|         if(fmt.substr(i, i+6).toLowerCase() !== "general") | ||||
|         if(fmt.substr(i, 7).toLowerCase() !== "general") | ||||
|           throw new Error('unrecognized character ' + fmt[i] + ' in ' +fmt); | ||||
|         out.push({t:'G',v:'General'}); i+=7; break; | ||||
| ``` | ||||
| @ -583,11 +583,22 @@ mode but I'm not convinced that's the right approach) | ||||
|         out.push({t:'T', v:v}); ++i; break; | ||||
| ``` | ||||
| 
 | ||||
| `B1` and `B2` specify which calendar to use, while `b` is the buddhist year.  It | ||||
| acts just like `y` except the year is shifted: | ||||
| 
 | ||||
| ``` | ||||
|       case 'B': case 'b': | ||||
|         if(fmt[i+1] === "1" || fmt[i+1] === "2") { | ||||
|           if(!dt) dt = parse_date_code(v, opts, fmt[i+1] === "2"); | ||||
|           q={t:'X', v:fmt.substr(i,2)}; out.push(q); lst = c; i+=2; break; | ||||
|         } | ||||
|         /* falls through */ | ||||
| ``` | ||||
| 
 | ||||
| The date codes `m,d,y,h,s` are standard.  There are some special formats like | ||||
| `e / g` (era year) that have different behaviors in Japanese/Chinese locales. | ||||
| 
 | ||||
| ``` | ||||
|       /* Dates */ | ||||
|       case 'M': case 'D': case 'Y': case 'H': case 'S': case 'E': | ||||
|         c = c.toLowerCase(); | ||||
|         /* falls through */ | ||||
| @ -646,7 +657,7 @@ Conditional and color blocks should be handled at one point (TODO).  The | ||||
| pseudo-type `Z` is used to capture absolute time blocks: | ||||
| 
 | ||||
| ``` | ||||
|       case '[': /* TODO: Fix this -- ignore all conditionals and formatting */ | ||||
|       case '[': | ||||
|         o = c; | ||||
|         while(fmt[i++] !== ']' && i < fmt.length) o += fmt[i]; | ||||
|         if(o.substr(-1) !== ']') throw 'unterminated "[" block: |' + o + '|'; | ||||
| @ -701,11 +712,10 @@ The nonzero digits show up in fraction denominators: | ||||
| 
 | ||||
| The default magic characters are listed in subsubsections 18.8.30-31 of ECMA376: | ||||
| 
 | ||||
| 
 | ||||
| ``` | ||||
|       case ' ': out.push({t:c,v:c}); ++i; break; | ||||
|       default: | ||||
|         if(",$-+/():!^&'~{}<>=€".indexOf(c) === -1) | ||||
|         if(",$-+/():!^&'~{}<>=€acfijklopqrtuvwxz".indexOf(c) === -1) | ||||
|           throw 'unrecognized character ' + fmt[i] + ' in ' + fmt; | ||||
|         out.push({t:'t', v:c}); ++i; break; | ||||
|     } | ||||
| @ -726,6 +736,8 @@ identify the smallest time unit (0 = no time, 1 = hour, 2 = minute, 3 = second): | ||||
|       /* falls through */ | ||||
|       case 'd': case 'y': case 'M': case 'e': lst=out[i].t; break; | ||||
|       case 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break; | ||||
|       case 'X': if(out[i].v === "B2"); | ||||
|         break; | ||||
|       case 'Z': | ||||
|         if(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1; | ||||
|         if(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2; | ||||
| @ -758,8 +770,9 @@ Finally, actually write the numbers: | ||||
|   for(i=0; i < out.length; ++i) { | ||||
|     switch(out[i].t) { | ||||
|       case 't': case 'T': case ' ': case 'D': break; | ||||
|       case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'Z': | ||||
|         out[i].v = write_date(out[i].t, out[i].v, dt, bt); | ||||
|       case 'X': delete out[i]; break; | ||||
|       case 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z': | ||||
|         out[i].v = write_date(out[i].t, out[i].v, dt); | ||||
|         out[i].t = 't'; break; | ||||
|       case 'n': case '(': case '?': | ||||
|         var jj = i+1; | ||||
| @ -801,18 +814,25 @@ display minutes instead of the month. | ||||
| /*jshint -W086 */ | ||||
| var write_date = function(type, fmt, val) { | ||||
|   if(val < 0) return ""; | ||||
|   var o, ss; | ||||
|   var o, ss, y = val.y; | ||||
|   switch(type) { | ||||
|     case 'y': switch(fmt) { /* year */ | ||||
|       case 'y': case 'yy': return pad(val.y % 100,2); | ||||
| ``` | ||||
| 
 | ||||
| `b` years are shifted by 543 (`y` 1900 == `b` 2443): | ||||
| 
 | ||||
| ``` | ||||
|     case 'b': y = val.y + 543; | ||||
|       /* falls through */ | ||||
|     case 'y': switch(fmt.length) { /* year */ | ||||
|       case 1: case 2: return pad(y % 100,2); | ||||
| ``` | ||||
| 
 | ||||
| Apparently, even `yyyyyyyyyyyyyyyyyyyy` is a 4 digit year | ||||
| 
 | ||||
| ``` | ||||
|       default: return pad(val.y % 10000,4); | ||||
|       default: return pad(y % 10000,4); | ||||
|     } | ||||
|     case 'm': switch(fmt) { /* month */ | ||||
|     case 'm': switch(fmt) { | ||||
|       case 'm': return val.m; | ||||
|       case 'mm': return pad(val.m,2); | ||||
|       case 'mmm': return months[val.m-1][1]; | ||||
| @ -1119,7 +1139,7 @@ coveralls: | ||||
| ```json>package.json | ||||
| { | ||||
|   "name": "ssf", | ||||
|   "version": "0.6.2", | ||||
|   "version": "0.6.3", | ||||
|   "author": "SheetJS", | ||||
|   "description": "pure-JS library to format data using ECMA-376 spreadsheet Format Codes", | ||||
|   "keywords": [ "format", "sprintf", "spreadsheet" ], | ||||
| @ -1237,6 +1257,7 @@ The dates test driver tests the date and time formats: | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var dates = fs.readFileSync('./test/dates.tsv','utf8').split("\n"); | ||||
| var date2 = fs.readFileSync('./test/cal.tsv',  'utf8').split("\n"); | ||||
| var times = fs.readFileSync('./test/times.tsv','utf8').split("\n"); | ||||
| 
 | ||||
| function doit(data) { | ||||
| @ -1255,9 +1276,12 @@ function doit(data) { | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| describe('time formats', function() { doit(process.env.MINTEST ? times.slice(0,4000) : times); }); | ||||
| describe('time formats', function() { | ||||
|   doit(process.env.MINTEST ? times.slice(0,4000) : times); | ||||
| }); | ||||
| describe('date formats', function() { | ||||
|   doit(process.env.MINTEST ? dates.slice(0,1000) : dates); | ||||
|   doit(process.env.MINTEST ? dates.slice(0,4000) : dates); | ||||
|   //doit(process.env.MINTEST ? date2.slice(0,1000) : date2); | ||||
|   it('should fail for bad formats', function() { | ||||
|     var bad = []; | ||||
|     var chk = function(fmt){ return function(){ SSF.format(fmt,0); }; }; | ||||
|  | ||||
							
								
								
									
										1048576
									
								
								test/cal.tsv
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										1048576
									
								
								test/cal.tsv
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -3,6 +3,7 @@ | ||||
| var SSF = require('../'); | ||||
| var fs = require('fs'), assert = require('assert'); | ||||
| var dates = fs.readFileSync('./test/dates.tsv','utf8').split("\n"); | ||||
| var date2 = fs.readFileSync('./test/cal.tsv',  'utf8').split("\n"); | ||||
| var times = fs.readFileSync('./test/times.tsv','utf8').split("\n"); | ||||
| 
 | ||||
| function doit(data) { | ||||
| @ -21,9 +22,12 @@ function doit(data) { | ||||
|     } | ||||
|   }); | ||||
| } | ||||
| describe('time formats', function() { doit(process.env.MINTEST ? times.slice(0,4000) : times); }); | ||||
| describe('time formats', function() { | ||||
|   doit(process.env.MINTEST ? times.slice(0,4000) : times); | ||||
| }); | ||||
| describe('date formats', function() { | ||||
|   doit(process.env.MINTEST ? dates.slice(0,1000) : dates); | ||||
|   doit(process.env.MINTEST ? dates.slice(0,4000) : dates); | ||||
|   //doit(process.env.MINTEST ? date2.slice(0,1000) : date2);
 | ||||
|   it('should fail for bad formats', function() { | ||||
|     var bad = []; | ||||
|     var chk = function(fmt){ return function(){ SSF.format(fmt,0); }; }; | ||||
|  | ||||
| @ -15,7 +15,7 @@ | ||||
|   ["[Blue]General", [1, "1"], [-1, "-1"], [0, "0"], ["sheetjs", "sheetjs"]], | ||||
|   ["[Blue]G3neral", [1], [-1], [0], ["TODO","TODO"]], | ||||
|   ["A\"TODO\"", [1, "ATODO"], [-1, "ATODO"], [0, "ATODO"], ["TODO","TODO"]], | ||||
|   ["r", [1], [-1], [0], ["TODO","TODO"]], | ||||
|   ["r", [1,"r"], [-1,"-r","#"], [0,"r"], ["sheetjs","sheetjs"]], | ||||
|   ["((;@", [1,"(("], [0,"(("], ["foo","foo"]], | ||||
|   ["\\r", [1, "r"], [-1, "r"], [0, "r"], ["TODO","TODO"]], | ||||
|   ["_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(@_)", [1, " $1 "], [-1, " $(1)"], [0," $- "], ["TODO", " TODO "], ["",""]], | ||||
| @ -48,27 +48,27 @@ | ||||
|   ["123", [0.7, "123"], [0, "123"], ["sheetjs", "sheetjs"]], | ||||
|   ["0.##", [1,"1."], [-1,"-1."], [0, "0."], [1.1, "1.1"], [-1.2, "-1.2"], [1000000000000.01, "1000000000000.01"], [-1000.01, "-1000.01"], [0.1, "0.1"], [1.007, "1.01"], [-1.008, "-1.01"]], | ||||
|   ["** #,###,#00,000.00,**", | ||||
|     [1.2345, " 00,000.00"], | ||||
|     [12.345, " 00,000.01"], | ||||
|     [123.45, " 00,000.12"], | ||||
|     [1234.56, " 00,001.23"], | ||||
|     [12345.67, " 00,012.35"], | ||||
|     [123456.78, " 00,123.46"], | ||||
|     [1234567.89, " 01,234.57"], | ||||
|     [12345681.9, " 12,345.68"], | ||||
|     [123456822, " 123,456.82"], | ||||
|     [1234568223, " 1,234,568.22"], | ||||
|     [12345682233, " 12,345,682.23"], | ||||
|     [123456822333, " 123,456,822.33"], | ||||
|     [1234568223333, " 1,234,568,223.33"], | ||||
|     [12345682233333, " 12,345,682,233.33"], | ||||
|     [123456822333333, " 123,456,822,333.33"], | ||||
|     [1234568223333330, " 1,234,568,223,333.33"], | ||||
|     [12345682233333300, " 12,345,682,233,333.30"], | ||||
|     [123456822333333000, " 123,456,822,333,333.00", "#"], | ||||
|     [1234568223333330000, " 1,234,568,223,333,330.00"], | ||||
|     [12345682233333300000, " 12,345,682,233,333,300.00"], | ||||
|     [123456822333333000000, " 123,456,822,333,333,000.00"], | ||||
|     [1.2345,                                    " 00,000.00"], | ||||
|     [12.345,                                    " 00,000.01"], | ||||
|     [123.45,                                    " 00,000.12"], | ||||
|     [1234.56,                                   " 00,001.23"], | ||||
|     [12345.67,                                  " 00,012.35"], | ||||
|     [123456.78,                                 " 00,123.46"], | ||||
|     [1234567.89,                                " 01,234.57"], | ||||
|     [12345681.9,                                " 12,345.68"], | ||||
|     [123456822,                                " 123,456.82"], | ||||
|     [1234568223,                             " 1,234,568.22"], | ||||
|     [12345682233,                           " 12,345,682.23"], | ||||
|     [123456822333,                         " 123,456,822.33"], | ||||
|     [1234568223333,                      " 1,234,568,223.33"], | ||||
|     [12345682233333,                    " 12,345,682,233.33"], | ||||
|     [123456822333333,                  " 123,456,822,333.33"], | ||||
|     [1234568223333330,               " 1,234,568,223,333.33"], | ||||
|     [12345682233333300,             " 12,345,682,233,333.30"], | ||||
|     [123456822333333000,           " 123,456,822,333,333.00", "#"], | ||||
|     [1234568223333330000,        " 1,234,568,223,333,330.00"], | ||||
|     [12345682233333300000,      " 12,345,682,233,333,300.00"], | ||||
|     [123456822333333000000,    " 123,456,822,333,333,000.00"], | ||||
|     [1234568223333330000000, " 1,234,568,223,333,330,000.00"] | ||||
|   ], | ||||
|   ["00000-0000", [941051630, "94105-1630"]], | ||||
| @ -76,7 +76,11 @@ | ||||
|   ["[<=9999999]###-####;(###) ###-####", [8675309, "867-5309"],[2813308004, "(281) 330-8004"]], | ||||
|   ["[Red][<-25]General;[Blue][>25]General;[Green]General;[Yellow]General", [50, "50"],[26, "26"],[25,"25"],[1,"1"],[0,"0"],[-1,"-1"],[-25,"-25"],[-26,"26","#"],[-50,"50","#"], ["foo","foo"],["bar","bar"]], | ||||
|   ["[Red][<=-25]General;[Blue][>=25]General;[Green]General;[Yellow]General", [50, "50"],[26, "26"],[25,"25"],[1,"1"],[0,"0"],[-1,"-1"],[-25,"-25"],[-26,"26","#"],[-50,"50","#"], ["foo","foo"],["bar","bar"]], | ||||
|   ["[Red]General ;[Blue]General\\ ;[Green]Generalp;[Yellow]General'", [50, "50 "],[0,"0p"],[-25,"-25 "],["foo","foo'"]], | ||||
|   ["[Red][=50]General;[Blue]000", [50, "50"], [51, "051"], [49, "049"]], | ||||
|   ["[Red][<>50]General;[Blue]000", [50, "050"], [51, "51"], [49, "49"]], | ||||
|   ["b", [1,"43"], [1000,"45"], [10000,"70"]], | ||||
|   ["B2yyyymmdd", [0,"13170829"], [1000,"13200624","#"], [10000,"13451117","#"]], | ||||
|   ["☃", [0], [1], [-1]], | ||||
|   ["\"foo\";\"bar\";\"baz\";\"qux\";\"foobar\"", [1], [0], [-1], ["sheetjs"]] | ||||
| ] | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user