diff --git a/bits/10_ssf.js b/bits/10_ssf.js index 7a47e55..7b76850 100644 --- a/bits/10_ssf.js +++ b/bits/10_ssf.js @@ -734,7 +734,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) { case 'A': case 'a': case '上': var q={t:c, v:c}; if(dt==null) dt=SSF_parse_date_code(v, opts); - if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} + if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;} else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } else { q.t = "t"; ++i; } diff --git a/packages/ssf/bits/82_eval.js b/packages/ssf/bits/82_eval.js index 47a02c8..90f0064 100644 --- a/packages/ssf/bits/82_eval.js +++ b/packages/ssf/bits/82_eval.js @@ -34,7 +34,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) { case 'A': case 'a': case '上': var q={t:c, v:c}; if(dt==null) dt=parse_date_code(v, opts); - if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} + if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;} else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } else { q.t = "t"; ++i; } diff --git a/packages/ssf/ssf.flow.js b/packages/ssf/ssf.flow.js index de5006a..9fa401a 100644 --- a/packages/ssf/ssf.flow.js +++ b/packages/ssf/ssf.flow.js @@ -729,7 +729,7 @@ function eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) { case 'A': case 'a': case '上': var q={t:c, v:c}; if(dt==null) dt=parse_date_code(v, opts); - if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} + if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;} else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } else { q.t = "t"; ++i; } diff --git a/packages/ssf/ssf.js b/packages/ssf/ssf.js index cfeadc8..d93de3c 100644 --- a/packages/ssf/ssf.js +++ b/packages/ssf/ssf.js @@ -722,7 +722,7 @@ function eval_fmt(fmt, v, opts, flen) { case 'A': case 'a': case '上': var q={t:c, v:c}; if(dt==null) dt=parse_date_code(v, opts); - if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? "P" : "A"; q.t = 'T'; hr='h';i+=3;} + if(fmt.substr(i, 3).toUpperCase() === "A/P") { if(dt!=null) q.v = dt.H >= 12 ? fmt.charAt(i+2) : c; q.t = 'T'; hr='h';i+=3;} else if(fmt.substr(i,5).toUpperCase() === "AM/PM") { if(dt!=null) q.v = dt.H >= 12 ? "PM" : "AM"; q.t = 'T'; i+=5; hr='h'; } else if(fmt.substr(i,5).toUpperCase() === "上午/下午") { if(dt!=null) q.v = dt.H >= 12 ? "下午" : "上午"; q.t = 'T'; i+=5; hr='h'; } else { q.t = "t"; ++i; } diff --git a/packages/ssf/test/dateNF.js b/packages/ssf/test/dateNF.js index 5b6685f..f8d6f21 100644 --- a/packages/ssf/test/dateNF.js +++ b/packages/ssf/test/dateNF.js @@ -34,7 +34,7 @@ describe('asian formats', function() { //[ 'ปปปป', '๒๔๗๖'], [ 'b2yyyy', '1352'], [ 'b2eeee', '1352'], - [ 'b2bbbb', '1895'], + [ 'b2bbbb', '1895'] //[ 'b2ปปปป', '๑๘๙๕'] ] ].forEach(function(row) { @@ -48,3 +48,24 @@ describe('asian formats', function() { assert.equal(SSF.format('\u0E27/\u0E14/\u0E1B\u0E1B\u0E1B\u0E1B \u0E0A\u0E0A:\u0E19\u0E19:\u0E17\u0E17', 12345.67), "๑๘/๑๐/๒๔๗๖ ๑๖:๐๔:๔๘"); }); }); +describe('meridiem', function() { + it('should force am/pm uppercase', function() { + for(var i = 0; i < 16; ++i) { + var a = ((i & 8) ? "A" : "a") + ((i & 4) ? "M" : "m"); + var p = ((i & 2) ? "P" : "p") + ((i & 1) ? "M" : "m"); + var fmt = a + "/" + p; + assert.equal(SSF.format(fmt, 0.25), "AM"); + assert.equal(SSF.format(fmt, 0.75), "PM"); + } + }); + it('should use actual case for a/p', function() { + for(var i = 0; i < 12; ++i) { + var a = ((i & 2) ? "A" : "a"); + var p = ((i & 1) ? "P" : "p"); + var w = ["", 'm', 'M'][i>>2]; + var fmt = a + "/" + p + ["", '"m"', '"M"'][i>>2]; + assert.equal(SSF.format(fmt, 0.25), a + w); + assert.equal(SSF.format(fmt, 0.75), p + w); + } + }); +}); \ No newline at end of file