Skip to content

Commit 5d2ee53

Browse files
authored
This closes #2192, made special date format result consistent with Excel (#2193)
- Update unit tests
1 parent 11dcc8f commit 5d2ee53

File tree

3 files changed

+59
-21
lines changed

3 files changed

+59
-21
lines changed

excelize_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -780,8 +780,8 @@ func TestSetCellStyleNumberFormat(t *testing.T) {
780780
expected := [][]string{
781781
{"37947.75", "37948", "37947.75", "37,948", "37,947.75", "3794775%", "3794775.00%", "3.79E+04", "37947 3/4", "37947 3/4", "11-22-03", "22-Nov-03", "22-Nov", "Nov-03", "6:00 PM", "6:00:00 PM", "18:00", "18:00:00", "11/22/03 18:00", "37,948 ", "37,948 ", "37,947.75 ", "37,947.75 ", " 37,948 ", " $37,948 ", " 37,947.75 ", " $37,947.75 ", "00:00", "910746:00:00", "00:00.0", "37947.7500001", "37947.7500001"},
782782
{"-37947.75", "-37948", "-37947.75", "-37,948", "-37,947.75", "-3794775%", "-3794775.00%", "-3.79E+04", "-37947 3/4", "-37947 3/4", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "(37,948)", "(37,948)", "(37,947.75)", "(37,947.75)", " (37,948)", " $(37,948)", " (37,947.75)", " $(37,947.75)", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001", "-37947.7500001"},
783-
{"0.007", "0", "0.01", "0", "0.01", "1%", "0.70%", "7.00E-03", "0 ", "0 ", "12-30-99", "30-Dec-99", "30-Dec", "Dec-99", "12:10 AM", "12:10:05 AM", "00:10", "00:10:05", "12/30/99 00:10", "0 ", "0 ", "0.01 ", "0.01 ", " 0 ", " $0 ", " 0.01 ", " $0.01 ", "10:05", "0:10:05", "10:04.8", "0.007", "0.007"},
784-
{"2.1", "2", "2.10", "2", "2.10", "210%", "210.00%", "2.10E+00", "2 1/9", "2 1/10", "01-01-00", "1-Jan-00", "1-Jan", "Jan-00", "2:24 AM", "2:24:00 AM", "02:24", "02:24:00", "1/1/00 02:24", "2 ", "2 ", "2.10 ", "2.10 ", " 2 ", " $2 ", " 2.10 ", " $2.10 ", "24:00", "50:24:00", "24:00.0", "2.1", "2.1"},
783+
{"0.007", "0", "0.01", "0", "0.01", "1%", "0.70%", "7.00E-03", "0 ", "0 ", "01-00-00", "0-Jan-00", "0-Jan", "Jan-00", "12:10 AM", "12:10:05 AM", "00:10", "00:10:05", "1/0/00 00:10", "0 ", "0 ", "0.01 ", "0.01 ", " 0 ", " $0 ", " 0.01 ", " $0.01 ", "10:05", "0:10:05", "10:04.8", "0.007", "0.007"},
784+
{"2.1", "2", "2.10", "2", "2.10", "210%", "210.00%", "2.10E+00", "2 1/9", "2 1/10", "01-02-00", "2-Jan-00", "2-Jan", "Jan-00", "2:24 AM", "2:24:00 AM", "02:24", "02:24:00", "1/2/00 02:24", "2 ", "2 ", "2.10 ", "2.10 ", " 2 ", " $2 ", " 2.10 ", " $2.10 ", "24:00", "50:24:00", "24:00.0", "2.1", "2.1"},
785785
{"String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", "String", " String ", " String ", " String ", " String ", "String", "String", "String", "String", "String"},
786786
}
787787

numfmt.go

Lines changed: 55 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -7425,35 +7425,54 @@ func localMonthsNameZulu(t time.Time, abbr int) string {
74257425

74267426
// localMonthsName return months name by supported language ID.
74277427
func (nf *numberFormat) localMonthsName(abbr int) string {
7428+
t := nf.t
7429+
if nf.number < 1 {
7430+
t = timeFromExcelTime(nf.number+2, nf.date1904)
7431+
}
7432+
if 1 <= nf.number && nf.number < 60 {
7433+
t = timeFromExcelTime(nf.number+1, nf.date1904)
7434+
}
74287435
if languageInfo, ok := getSupportedLanguageInfo(nf.localCode); ok {
7429-
return languageInfo.localMonth(nf.t, abbr)
7436+
return languageInfo.localMonth(t, abbr)
7437+
}
7438+
return localMonthsNameEnglish(t, abbr)
7439+
}
7440+
7441+
// dateAmPmHandler will be handling am/pm types tokens for a number format.
7442+
func (nf *numberFormat) dateAmPmHandler(i int, token nfp.Token) {
7443+
if nf.ap == "" {
7444+
nextHours := nf.hoursNext(i)
7445+
aps := strings.Split(nf.localAmPm(token.TValue), "/")
7446+
nf.ap = aps[0]
7447+
if nextHours >= 12 {
7448+
nf.ap = aps[1]
7449+
}
74307450
}
7431-
return localMonthsNameEnglish(nf.t, abbr)
7451+
nf.result += nf.ap
74327452
}
74337453

74347454
// dateTimesHandler will be handling date and times types tokens for a number
74357455
// format expression.
74367456
func (nf *numberFormat) dateTimesHandler(i int, token nfp.Token) {
74377457
if idx := inStrSlice(nfp.AmPm, strings.ToUpper(token.TValue), false); idx != -1 {
7438-
if nf.ap == "" {
7439-
nextHours := nf.hoursNext(i)
7440-
aps := strings.Split(nf.localAmPm(token.TValue), "/")
7441-
nf.ap = aps[0]
7442-
if nextHours >= 12 {
7443-
nf.ap = aps[1]
7444-
}
7445-
}
7446-
nf.result += nf.ap
7458+
nf.dateAmPmHandler(i, token)
74477459
return
74487460
}
74497461
if strings.Contains(strings.ToUpper(token.TValue), "M") {
7462+
m := int(nf.t.Month())
7463+
if nf.number < 2 {
7464+
m = 1
7465+
}
7466+
if 60 <= nf.number && nf.number < 61 {
7467+
m = 2
7468+
}
74507469
l := len(token.TValue)
74517470
if l == 1 && nf.isMonthToken(i) {
7452-
nf.result += strconv.Itoa(int(nf.t.Month()))
7471+
nf.result += strconv.Itoa(int(m))
74537472
return
74547473
}
74557474
if l == 2 && nf.isMonthToken(i) {
7456-
nf.result += fmt.Sprintf("%02d", int(nf.t.Month()))
7475+
nf.result += fmt.Sprintf("%02d", int(m))
74577476
return
74587477
}
74597478
if l == 3 {
@@ -7528,8 +7547,12 @@ func (nf *numberFormat) japaneseYearHandler(token nfp.Token, langInfo languageIn
75287547

75297548
// republicOfChinaYearHandler handling the Republic of China calendar years.
75307549
func (nf *numberFormat) republicOfChinaYearHandler(token nfp.Token, langInfo languageInfo) {
7550+
year := nf.t.Year()
7551+
if nf.number < 2 {
7552+
year = 1900
7553+
}
75317554
if strings.Contains(strings.ToUpper(token.TValue), "G") {
7532-
year := nf.t.Year() - republicOfChinaYear.Year() + 1
7555+
year = year - republicOfChinaYear.Year() + 1
75337556
if year == 1 {
75347557
nf.useGannen = langInfo.useGannen
75357558
}
@@ -7543,7 +7566,7 @@ func (nf *numberFormat) republicOfChinaYearHandler(token nfp.Token, langInfo lan
75437566
nf.result += name
75447567
}
75457568
if strings.Contains(strings.ToUpper(token.TValue), "E") {
7546-
year := nf.t.Year() - republicOfChinaYear.Year() + 1
7569+
year = year - republicOfChinaYear.Year() + 1
75477570
if year < 0 {
75487571
year = republicOfChinaYear.Year() - nf.t.Year()
75497572
}
@@ -7561,8 +7584,11 @@ func (nf *numberFormat) republicOfChinaYearHandler(token nfp.Token, langInfo lan
75617584
// number format expression.
75627585
func (nf *numberFormat) yearsHandler(token nfp.Token) {
75637586
langInfo, _ := getSupportedLanguageInfo(nf.localCode)
7587+
year := nf.t.Year()
7588+
if nf.number < 2 {
7589+
year = 1900
7590+
}
75647591
if strings.Contains(strings.ToUpper(token.TValue), "Y") {
7565-
year := nf.t.Year()
75667592
if nf.opts != nil && nf.opts.CultureInfo == CultureNameKoKR {
75677593
year += 2333
75687594
}
@@ -7584,7 +7610,7 @@ func (nf *numberFormat) yearsHandler(token nfp.Token) {
75847610
return
75857611
}
75867612
if strings.Contains(strings.ToUpper(token.TValue), "E") {
7587-
nf.result += strconv.Itoa(nf.t.Year())
7613+
nf.result += strconv.Itoa(year)
75887614
return
75897615
}
75907616
}
@@ -7611,11 +7637,21 @@ func (nf *numberFormat) daysHandler(token nfp.Token) {
76117637
return
76127638
}
76137639
if strings.Contains(strings.ToUpper(token.TValue), "D") {
7640+
d := nf.t.Day()
7641+
if nf.number < 1 {
7642+
d = 0
7643+
}
7644+
if 1 <= nf.number && nf.number < 60 {
7645+
d = timeFromExcelTime(nf.number+1, nf.date1904).Day()
7646+
}
7647+
if 60 <= nf.number && nf.number < 61 {
7648+
d = 29
7649+
}
76147650
switch l {
76157651
case 1:
7616-
nf.result += strconv.Itoa(nf.t.Day())
7652+
nf.result += strconv.Itoa(d)
76177653
case 2:
7618-
nf.result += fmt.Sprintf("%02d", nf.t.Day())
7654+
nf.result += fmt.Sprintf("%02d", d)
76197655
case 3:
76207656
nf.result += weekdayNamesAbbr[nf.t.Weekday()]
76217657
default:

numfmt_test.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ func TestNumFmt(t *testing.T) {
7878
{"0", "0%", "0%"},
7979
{"0", "0.0%", "0.0%"},
8080
{"0", "0.00%", "0.00%"},
81+
{"0", "[$-zh-TW]yyyy\"\"m\"\"d\"\";@", "1900年1月0日"},
82+
{"60", "yyyy-mm-dd;@", "1900-02-29"},
8183
{"43528", "[$-409]MM/DD/YYYY", "03/04/2019"},
8284
{"43528", "[$-409]MM/DD/YYYY am/pm", "03/04/2019 AM"},
8385
{"43528", "[$-111]MM/DD/YYYY", "43528"},

0 commit comments

Comments
 (0)