This closes #1885, add new CultureNameJaJP, CultureNameKoKR and CultureNameZhTW enumeration values (#1895)
- Support apply number format for the Japanese calendar years, the Korean Danki calendar and the Republic of China year - Update unit tests Signed-off-by: wushiling50 <2531010934@qq.com>
This commit is contained in:
parent
f1d1a5dc2b
commit
d1937a0cde
7
calc.go
7
calc.go
|
@ -13629,7 +13629,9 @@ func (fn *formulaFuncs) DBCS(argsList *list.List) formulaArg {
|
||||||
if arg.Type == ArgError {
|
if arg.Type == ArgError {
|
||||||
return arg
|
return arg
|
||||||
}
|
}
|
||||||
if fn.f.options.CultureInfo == CultureNameZhCN {
|
if fn.f.options.CultureInfo == CultureNameJaJP ||
|
||||||
|
fn.f.options.CultureInfo == CultureNameZhCN ||
|
||||||
|
fn.f.options.CultureInfo == CultureNameZhTW {
|
||||||
var chars []string
|
var chars []string
|
||||||
for _, r := range arg.Value() {
|
for _, r := range arg.Value() {
|
||||||
code := r
|
code := r
|
||||||
|
@ -16378,7 +16380,10 @@ func (fn *formulaFuncs) DOLLAR(argsList *list.List) formulaArg {
|
||||||
symbol := map[CultureName]string{
|
symbol := map[CultureName]string{
|
||||||
CultureNameUnknown: "$",
|
CultureNameUnknown: "$",
|
||||||
CultureNameEnUS: "$",
|
CultureNameEnUS: "$",
|
||||||
|
CultureNameJaJP: "¥",
|
||||||
|
CultureNameKoKR: "\u20a9",
|
||||||
CultureNameZhCN: "¥",
|
CultureNameZhCN: "¥",
|
||||||
|
CultureNameZhTW: "NT$",
|
||||||
}[fn.f.options.CultureInfo]
|
}[fn.f.options.CultureInfo]
|
||||||
numFmtCode := fmt.Sprintf("%s#,##0%s%s;(%s#,##0%s%s)",
|
numFmtCode := fmt.Sprintf("%s#,##0%s%s;(%s#,##0%s%s)",
|
||||||
symbol, dot, strings.Repeat("0", decimals), symbol, dot, strings.Repeat("0", decimals))
|
symbol, dot, strings.Repeat("0", decimals), symbol, dot, strings.Repeat("0", decimals))
|
||||||
|
|
|
@ -870,11 +870,17 @@ func TestSetCellStyleCurrencyNumberFormat(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSetCellStyleLangNumberFormat(t *testing.T) {
|
func TestSetCellStyleLangNumberFormat(t *testing.T) {
|
||||||
rawCellValues := [][]string{{"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}}
|
rawCellValues := make([][]string, 42)
|
||||||
|
for i := 0; i < 42; i++ {
|
||||||
|
rawCellValues[i] = []string{"45162"}
|
||||||
|
}
|
||||||
for lang, expected := range map[CultureName][][]string{
|
for lang, expected := range map[CultureName][][]string{
|
||||||
CultureNameUnknown: rawCellValues,
|
CultureNameUnknown: rawCellValues,
|
||||||
CultureNameEnUS: {{"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"0:00:00"}, {"0:00:00"}, {"0:00:00"}, {"0:00:00"}, {"45162"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
CultureNameEnUS: {{"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"0:00:00"}, {"0:00:00"}, {"0:00:00"}, {"0:00:00"}, {"45162"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"8/24/23"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
|
CultureNameJaJP: {{"R5.8.24"}, {"令和5年8月24日"}, {"令和5年8月24日"}, {"8/24/23"}, {"2023年8月24日"}, {"0時00分"}, {"0時00分00秒"}, {"2023年8月"}, {"8月24日"}, {"R5.8.24"}, {"R5.8.24"}, {"令和5年8月24日"}, {"2023年8月"}, {"8月24日"}, {"令和5年8月24日"}, {"2023年8月"}, {"8月24日"}, {"R5.8.24"}, {"令和5年8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
|
CultureNameKoKR: [][]string{[]string{"4356年 08月 24日"}, []string{"08-24"}, []string{"08-24"}, []string{"08-24-56"}, []string{"4356년 08월 24일"}, []string{"0시 00분"}, []string{"0시 00분 00초"}, []string{"4356-08-24"}, []string{"4356-08-24"}, []string{"4356年 08月 24日"}, []string{"4356年 08月 24日"}, []string{"08-24"}, []string{"4356-08-24"}, []string{"4356-08-24"}, []string{"08-24"}, []string{"4356-08-24"}, []string{"4356-08-24"}, []string{"4356年 08月 24日"}, []string{"08-24"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}},
|
||||||
CultureNameZhCN: {{"2023年8月"}, {"8月24日"}, {"8月24日"}, {"8/24/23"}, {"2023年8月24日"}, {"0时00分"}, {"0时00分00秒"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"2023年8月"}, {"8月24日"}, {"2023年8月"}, {"8月24日"}, {"8月24日"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
CultureNameZhCN: {{"2023年8月"}, {"8月24日"}, {"8月24日"}, {"8/24/23"}, {"2023年8月24日"}, {"0时00分"}, {"0时00分00秒"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"2023年8月"}, {"8月24日"}, {"2023年8月"}, {"8月24日"}, {"8月24日"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
|
CultureNameZhTW: {{"112/8/24"}, {"112年8月24日"}, {"112年8月24日"}, {"8/24/23"}, {"2023年8月24日"}, {"00時00分"}, {"00時00分00秒"}, {"上午12時00分"}, {"上午12時00分00秒"}, {"112/8/24"}, {"112/8/24"}, {"112年8月24日"}, {"上午12時00分"}, {"上午12時00分00秒"}, {"112年8月24日"}, {"上午12時00分"}, {"上午12時00分00秒"}, {"112/8/24"}, {"112年8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
} {
|
} {
|
||||||
f, err := prepareTestBook5(Options{CultureInfo: lang})
|
f, err := prepareTestBook5(Options{CultureInfo: lang})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
@ -886,7 +892,10 @@ func TestSetCellStyleLangNumberFormat(t *testing.T) {
|
||||||
// Test apply language number format code with date and time pattern
|
// Test apply language number format code with date and time pattern
|
||||||
for lang, expected := range map[CultureName][][]string{
|
for lang, expected := range map[CultureName][][]string{
|
||||||
CultureNameEnUS: {{"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"00:00:00"}, {"00:00:00"}, {"00:00:00"}, {"00:00:00"}, {"45162"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
CultureNameEnUS: {{"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"00:00:00"}, {"00:00:00"}, {"00:00:00"}, {"00:00:00"}, {"45162"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"2023-8-24"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
|
CultureNameJaJP: {{"R5.8.24"}, {"令和5年8月24日"}, {"令和5年8月24日"}, {"2023-8-24"}, {"2023年8月24日"}, {"00:00:00"}, {"00:00:00"}, {"2023年8月"}, {"8月24日"}, {"R5.8.24"}, {"R5.8.24"}, {"令和5年8月24日"}, {"2023年8月"}, {"8月24日"}, {"令和5年8月24日"}, {"2023年8月"}, {"8月24日"}, {"R5.8.24"}, {"令和5年8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
|
CultureNameKoKR: [][]string{[]string{"4356年 08月 24日"}, []string{"08-24"}, []string{"08-24"}, []string{"4356-8-24"}, []string{"4356년 08월 24일"}, []string{"00:00:00"}, []string{"00:00:00"}, []string{"4356-08-24"}, []string{"4356-08-24"}, []string{"4356年 08月 24日"}, []string{"4356年 08月 24日"}, []string{"08-24"}, []string{"4356-08-24"}, []string{"4356-08-24"}, []string{"08-24"}, []string{"4356-08-24"}, []string{"4356-08-24"}, []string{"4356年 08月 24日"}, []string{"08-24"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}, []string{"45162"}},
|
||||||
CultureNameZhCN: {{"2023年8月"}, {"8月24日"}, {"8月24日"}, {"2023-8-24"}, {"2023年8月24日"}, {"00:00:00"}, {"00:00:00"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"2023年8月"}, {"8月24日"}, {"2023年8月"}, {"8月24日"}, {"8月24日"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
CultureNameZhCN: {{"2023年8月"}, {"8月24日"}, {"8月24日"}, {"2023-8-24"}, {"2023年8月24日"}, {"00:00:00"}, {"00:00:00"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"2023年8月"}, {"8月24日"}, {"2023年8月"}, {"8月24日"}, {"8月24日"}, {"上午12时00分"}, {"上午12时00分00秒"}, {"2023年8月"}, {"8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
|
CultureNameZhTW: {{"112/8/24"}, {"112年8月24日"}, {"112年8月24日"}, {"2023-8-24"}, {"2023年8月24日"}, {"00:00:00"}, {"00:00:00"}, {"上午12時00分"}, {"上午12時00分00秒"}, {"112/8/24"}, {"112/8/24"}, {"112年8月24日"}, {"上午12時00分"}, {"上午12時00分00秒"}, {"112年8月24日"}, {"上午12時00分"}, {"上午12時00分00秒"}, {"112/8/24"}, {"112年8月24日"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}, {"45162"}},
|
||||||
} {
|
} {
|
||||||
f, err := prepareTestBook5(Options{CultureInfo: lang, ShortDatePattern: "yyyy-M-d", LongTimePattern: "hh:mm:ss"})
|
f, err := prepareTestBook5(Options{CultureInfo: lang, ShortDatePattern: "yyyy-M-d", LongTimePattern: "hh:mm:ss"})
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
|
|
172
numfmt.go
172
numfmt.go
|
@ -57,7 +57,10 @@ type CultureName byte
|
||||||
const (
|
const (
|
||||||
CultureNameUnknown CultureName = iota
|
CultureNameUnknown CultureName = iota
|
||||||
CultureNameEnUS
|
CultureNameEnUS
|
||||||
|
CultureNameJaJP
|
||||||
|
CultureNameKoKR
|
||||||
CultureNameZhCN
|
CultureNameZhCN
|
||||||
|
CultureNameZhTW
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -791,7 +794,7 @@ var (
|
||||||
31748: {tags: []string{"zh-Hant"}, localMonth: localMonthsNameChinese3, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
31748: {tags: []string{"zh-Hant"}, localMonth: localMonthsNameChinese3, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
||||||
3076: {tags: []string{"zh-HK"}, localMonth: localMonthsNameChinese2, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
3076: {tags: []string{"zh-HK"}, localMonth: localMonthsNameChinese2, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
||||||
5124: {tags: []string{"zh-MO"}, localMonth: localMonthsNameChinese3, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
5124: {tags: []string{"zh-MO"}, localMonth: localMonthsNameChinese3, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
||||||
1028: {tags: []string{"zh-TW"}, localMonth: localMonthsNameChinese3, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2},
|
1028: {tags: []string{"zh-TW"}, localMonth: localMonthsNameChinese3, apFmt: nfp.AmPm[2], weekdayNames: weekdayNamesChinese, weekdayNamesAbbr: weekdayNamesChineseAbbr2, useGannen: true},
|
||||||
9: {tags: []string{"en"}, localMonth: localMonthsNameEnglish, apFmt: nfp.AmPm[0], weekdayNames: weekdayNamesEnglish, weekdayNamesAbbr: weekdayNamesEnglishAbbr},
|
9: {tags: []string{"en"}, localMonth: localMonthsNameEnglish, apFmt: nfp.AmPm[0], weekdayNames: weekdayNamesEnglish, weekdayNamesAbbr: weekdayNamesEnglishAbbr},
|
||||||
4096: {tags: []string{
|
4096: {tags: []string{
|
||||||
"aa", "aa-DJ", "aa-ER", "aa-ER", "aa-NA", "agq", "agq-CM", "ak", "ak-GH", "sq-ML",
|
"aa", "aa-DJ", "aa-ER", "aa-ER", "aa-NA", "agq", "agq-CM", "ak", "ak-GH", "sq-ML",
|
||||||
|
@ -1168,6 +1171,10 @@ var (
|
||||||
"JA-JP-X-GANNEN": {tags: []string{"ja-JP"}, localMonth: localMonthsNameChinese3, apFmt: apFmtJapanese, weekdayNames: weekdayNamesJapanese, weekdayNamesAbbr: weekdayNamesJapaneseAbbr},
|
"JA-JP-X-GANNEN": {tags: []string{"ja-JP"}, localMonth: localMonthsNameChinese3, apFmt: apFmtJapanese, weekdayNames: weekdayNamesJapanese, weekdayNamesAbbr: weekdayNamesJapaneseAbbr},
|
||||||
"JA-JP-X-GANNEN,80": {tags: []string{"ja-JP"}, localMonth: localMonthsNameChinese3, apFmt: apFmtJapanese, weekdayNames: weekdayNamesJapanese, weekdayNamesAbbr: weekdayNamesJapaneseAbbr, useGannen: true},
|
"JA-JP-X-GANNEN,80": {tags: []string{"ja-JP"}, localMonth: localMonthsNameChinese3, apFmt: apFmtJapanese, weekdayNames: weekdayNamesJapanese, weekdayNamesAbbr: weekdayNamesJapaneseAbbr, useGannen: true},
|
||||||
}
|
}
|
||||||
|
// republicOfChinaYear defined start time of the Republic of China
|
||||||
|
republicOfChinaYear = time.Date(1912, time.January, 1, 0, 0, 0, 0, time.UTC)
|
||||||
|
// republicOfChinaEraName defined the Republic of China era name for the Republic of China calendar.
|
||||||
|
republicOfChinaEraName = []string{"\u4e2d\u83ef\u6c11\u570b", "\u6c11\u570b", "\u524d"}
|
||||||
// japaneseEraYears list the Japanese era name periods.
|
// japaneseEraYears list the Japanese era name periods.
|
||||||
japaneseEraYears = []time.Time{
|
japaneseEraYears = []time.Time{
|
||||||
time.Date(1868, time.August, 8, 0, 0, 0, 0, time.UTC),
|
time.Date(1868, time.August, 8, 0, 0, 0, 0, time.UTC),
|
||||||
|
@ -4634,6 +4641,24 @@ var (
|
||||||
return r.Replace(s)
|
return r.Replace(s)
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
// langNumFmtFunc defines functions to apply language number format code.
|
||||||
|
langNumFmtFunc = map[CultureName]func(f *File, numFmtID int) string{
|
||||||
|
CultureNameEnUS: func(f *File, numFmtID int) string {
|
||||||
|
return f.langNumFmtFuncEnUS(numFmtID)
|
||||||
|
},
|
||||||
|
CultureNameJaJP: func(f *File, numFmtID int) string {
|
||||||
|
return f.langNumFmtFuncJaJP(numFmtID)
|
||||||
|
},
|
||||||
|
CultureNameKoKR: func(f *File, numFmtID int) string {
|
||||||
|
return f.langNumFmtFuncKoKR(numFmtID)
|
||||||
|
},
|
||||||
|
CultureNameZhCN: func(f *File, numFmtID int) string {
|
||||||
|
return f.langNumFmtFuncZhCN(numFmtID)
|
||||||
|
},
|
||||||
|
CultureNameZhTW: func(f *File, numFmtID int) string {
|
||||||
|
return f.langNumFmtFuncZhTW(numFmtID)
|
||||||
|
},
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
// getSupportedLanguageInfo returns language infomation by giving language code.
|
// getSupportedLanguageInfo returns language infomation by giving language code.
|
||||||
|
@ -4694,6 +4719,54 @@ func (f *File) langNumFmtFuncEnUS(numFmtID int) string {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// langNumFmtFuncJaJP returns number format code by given date and time pattern
|
||||||
|
// for country code ja-jp.
|
||||||
|
func (f *File) langNumFmtFuncJaJP(numFmtID int) string {
|
||||||
|
if numFmtID == 30 && f.options.ShortDatePattern != "" {
|
||||||
|
return f.options.ShortDatePattern
|
||||||
|
}
|
||||||
|
if (32 <= numFmtID && numFmtID <= 33) && f.options.LongTimePattern != "" {
|
||||||
|
return f.options.LongTimePattern
|
||||||
|
}
|
||||||
|
return langNumFmt["ja-jp"][numFmtID]
|
||||||
|
}
|
||||||
|
|
||||||
|
// langNumFmtFuncKoKR returns number format code by given date and time pattern
|
||||||
|
// for country code ko-kr.
|
||||||
|
func (f *File) langNumFmtFuncKoKR(numFmtID int) string {
|
||||||
|
if numFmtID == 30 && f.options.ShortDatePattern != "" {
|
||||||
|
return f.options.ShortDatePattern
|
||||||
|
}
|
||||||
|
if (32 <= numFmtID && numFmtID <= 33) && f.options.LongTimePattern != "" {
|
||||||
|
return f.options.LongTimePattern
|
||||||
|
}
|
||||||
|
return langNumFmt["ko-kr"][numFmtID]
|
||||||
|
}
|
||||||
|
|
||||||
|
// langNumFmtFuncZhCN returns number format code by given date and time pattern
|
||||||
|
// for country code zh-cn.
|
||||||
|
func (f *File) langNumFmtFuncZhCN(numFmtID int) string {
|
||||||
|
if numFmtID == 30 && f.options.ShortDatePattern != "" {
|
||||||
|
return f.options.ShortDatePattern
|
||||||
|
}
|
||||||
|
if (32 <= numFmtID && numFmtID <= 33) && f.options.LongTimePattern != "" {
|
||||||
|
return f.options.LongTimePattern
|
||||||
|
}
|
||||||
|
return langNumFmt["zh-cn"][numFmtID]
|
||||||
|
}
|
||||||
|
|
||||||
|
// langNumFmtFuncZhTW returns number format code by given date and time pattern
|
||||||
|
// for country code zh-tw.
|
||||||
|
func (f *File) langNumFmtFuncZhTW(numFmtID int) string {
|
||||||
|
if numFmtID == 30 && f.options.ShortDatePattern != "" {
|
||||||
|
return f.options.ShortDatePattern
|
||||||
|
}
|
||||||
|
if (32 <= numFmtID && numFmtID <= 33) && f.options.LongTimePattern != "" {
|
||||||
|
return f.options.LongTimePattern
|
||||||
|
}
|
||||||
|
return langNumFmt["zh-tw"][numFmtID]
|
||||||
|
}
|
||||||
|
|
||||||
// checkDateTimePattern check and validate date and time options field value.
|
// checkDateTimePattern check and validate date and time options field value.
|
||||||
func (f *File) checkDateTimePattern() error {
|
func (f *File) checkDateTimePattern() error {
|
||||||
for _, pattern := range []string{f.options.LongDatePattern, f.options.LongTimePattern, f.options.ShortDatePattern} {
|
for _, pattern := range []string{f.options.LongDatePattern, f.options.LongTimePattern, f.options.ShortDatePattern} {
|
||||||
|
@ -4770,18 +4843,6 @@ func (f *File) extractNumFmtDecimal(fmtCode string) int {
|
||||||
return -1
|
return -1
|
||||||
}
|
}
|
||||||
|
|
||||||
// langNumFmtFuncZhCN returns number format code by given date and time pattern
|
|
||||||
// for country code zh-cn.
|
|
||||||
func (f *File) langNumFmtFuncZhCN(numFmtID int) string {
|
|
||||||
if numFmtID == 30 && f.options.ShortDatePattern != "" {
|
|
||||||
return f.options.ShortDatePattern
|
|
||||||
}
|
|
||||||
if (32 <= numFmtID && numFmtID <= 33) && f.options.LongTimePattern != "" {
|
|
||||||
return f.options.LongTimePattern
|
|
||||||
}
|
|
||||||
return langNumFmt["zh-cn"][numFmtID]
|
|
||||||
}
|
|
||||||
|
|
||||||
// getBuiltInNumFmtCode convert number format index to number format code with
|
// getBuiltInNumFmtCode convert number format index to number format code with
|
||||||
// specified locale and language.
|
// specified locale and language.
|
||||||
func (f *File) getBuiltInNumFmtCode(numFmtID int) (string, bool) {
|
func (f *File) getBuiltInNumFmtCode(numFmtID int) (string, bool) {
|
||||||
|
@ -4789,11 +4850,8 @@ func (f *File) getBuiltInNumFmtCode(numFmtID int) (string, bool) {
|
||||||
return fmtCode, true
|
return fmtCode, true
|
||||||
}
|
}
|
||||||
if isLangNumFmt(numFmtID) {
|
if isLangNumFmt(numFmtID) {
|
||||||
if f.options.CultureInfo == CultureNameEnUS {
|
if fn, ok := langNumFmtFunc[f.options.CultureInfo]; ok {
|
||||||
return f.langNumFmtFuncEnUS(numFmtID), true
|
return fn(f, numFmtID), true
|
||||||
}
|
|
||||||
if f.options.CultureInfo == CultureNameZhCN {
|
|
||||||
return f.langNumFmtFuncZhCN(numFmtID), true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return "", false
|
return "", false
|
||||||
|
@ -6912,23 +6970,13 @@ func eraYear(t time.Time) (int, int) {
|
||||||
return i, year
|
return i, year
|
||||||
}
|
}
|
||||||
|
|
||||||
// yearsHandler will be handling years in the date and times types tokens for a
|
// japaneseYearHandler handling the Japanease calendar years.
|
||||||
// number format expression.
|
func (nf *numberFormat) japaneseYearHandler(token nfp.Token, langInfo languageInfo) {
|
||||||
func (nf *numberFormat) yearsHandler(token nfp.Token) {
|
|
||||||
if strings.Contains(strings.ToUpper(token.TValue), "Y") {
|
|
||||||
if len(token.TValue) <= 2 {
|
|
||||||
nf.result += strconv.Itoa(nf.t.Year())[2:]
|
|
||||||
return
|
|
||||||
}
|
|
||||||
nf.result += strconv.Itoa(nf.t.Year())
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if strings.Contains(strings.ToUpper(token.TValue), "G") {
|
if strings.Contains(strings.ToUpper(token.TValue), "G") {
|
||||||
i, year := eraYear(nf.t)
|
i, year := eraYear(nf.t)
|
||||||
if year == -1 {
|
if year == -1 {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
langInfo, _ := getSupportedLanguageInfo(nf.localCode)
|
|
||||||
nf.useGannen = langInfo.useGannen
|
nf.useGannen = langInfo.useGannen
|
||||||
switch len(token.TValue) {
|
switch len(token.TValue) {
|
||||||
case 1:
|
case 1:
|
||||||
|
@ -6939,7 +6987,6 @@ func (nf *numberFormat) yearsHandler(token nfp.Token) {
|
||||||
default:
|
default:
|
||||||
nf.result += japaneseEraNames[i]
|
nf.result += japaneseEraNames[i]
|
||||||
}
|
}
|
||||||
return
|
|
||||||
}
|
}
|
||||||
if strings.Contains(strings.ToUpper(token.TValue), "E") {
|
if strings.Contains(strings.ToUpper(token.TValue), "E") {
|
||||||
_, year := eraYear(nf.t)
|
_, year := eraYear(nf.t)
|
||||||
|
@ -6961,6 +7008,69 @@ func (nf *numberFormat) yearsHandler(token nfp.Token) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// republicOfChinaYearHandler handling the Republic of China calendar years.
|
||||||
|
func (nf *numberFormat) republicOfChinaYearHandler(token nfp.Token, langInfo languageInfo) {
|
||||||
|
if strings.Contains(strings.ToUpper(token.TValue), "G") {
|
||||||
|
year := nf.t.Year() - republicOfChinaYear.Year() + 1
|
||||||
|
if year == 1 {
|
||||||
|
nf.useGannen = langInfo.useGannen
|
||||||
|
}
|
||||||
|
var name string
|
||||||
|
if name = republicOfChinaEraName[0]; len(token.TValue) < 3 {
|
||||||
|
name = republicOfChinaEraName[1]
|
||||||
|
}
|
||||||
|
if year < 0 {
|
||||||
|
name += republicOfChinaEraName[2]
|
||||||
|
}
|
||||||
|
nf.result += name
|
||||||
|
}
|
||||||
|
if strings.Contains(strings.ToUpper(token.TValue), "E") {
|
||||||
|
year := nf.t.Year() - republicOfChinaYear.Year() + 1
|
||||||
|
if year < 0 {
|
||||||
|
year = republicOfChinaYear.Year() - nf.t.Year()
|
||||||
|
}
|
||||||
|
if year == 1 && nf.useGannen {
|
||||||
|
nf.result += "\u5143"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if len(token.TValue) == 1 && !nf.useGannen {
|
||||||
|
nf.result += strconv.Itoa(year)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// yearsHandler will be handling years in the date and times types tokens for a
|
||||||
|
// number format expression.
|
||||||
|
func (nf *numberFormat) yearsHandler(token nfp.Token) {
|
||||||
|
langInfo, _ := getSupportedLanguageInfo(nf.localCode)
|
||||||
|
if strings.Contains(strings.ToUpper(token.TValue), "Y") {
|
||||||
|
year := nf.t.Year()
|
||||||
|
if nf.opts != nil && nf.opts.CultureInfo == CultureNameKoKR {
|
||||||
|
year += 2333
|
||||||
|
}
|
||||||
|
if len(token.TValue) <= 2 {
|
||||||
|
nf.result += strconv.Itoa(year)[2:]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
nf.result += strconv.Itoa(year)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if inStrSlice(langInfo.tags, "zh-TW", false) != -1 ||
|
||||||
|
nf.opts != nil && nf.opts.CultureInfo == CultureNameZhTW {
|
||||||
|
nf.republicOfChinaYearHandler(token, langInfo)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if inStrSlice(langInfo.tags, "ja-JP", false) != -1 ||
|
||||||
|
nf.opts != nil && nf.opts.CultureInfo == CultureNameJaJP {
|
||||||
|
nf.japaneseYearHandler(token, langInfo)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if strings.Contains(strings.ToUpper(token.TValue), "E") {
|
||||||
|
nf.result += strconv.Itoa(nf.t.Year())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// daysHandler will be handling days in the date and times types tokens for a
|
// daysHandler will be handling days in the date and times types tokens for a
|
||||||
// number format expression.
|
// number format expression.
|
||||||
func (nf *numberFormat) daysHandler(token nfp.Token) {
|
func (nf *numberFormat) daysHandler(token nfp.Token) {
|
||||||
|
|
|
@ -289,6 +289,20 @@ func TestNumFmt(t *testing.T) {
|
||||||
{"43543.503206018519", "[$-401]mmmm dd yyyy h:mm AM/PM aaa", "\u0645\u0627\u0631\u0633 19 2019 12:04 \u0645 \u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621"},
|
{"43543.503206018519", "[$-401]mmmm dd yyyy h:mm AM/PM aaa", "\u0645\u0627\u0631\u0633 19 2019 12:04 \u0645 \u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621"},
|
||||||
{"43543.503206018519", "[$-401]mmmmm dd yyyy h:mm AM/PM ddd", "\u0645 19 2019 12:04 \u0645 \u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621"},
|
{"43543.503206018519", "[$-401]mmmmm dd yyyy h:mm AM/PM ddd", "\u0645 19 2019 12:04 \u0645 \u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621"},
|
||||||
{"43543.503206018519", "[$-401]mmmmmm dd yyyy h:mm AM/PM dddd", "\u0645\u0627\u0631\u0633 19 2019 12:04 \u0645 \u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621"},
|
{"43543.503206018519", "[$-401]mmmmmm dd yyyy h:mm AM/PM dddd", "\u0645\u0627\u0631\u0633 19 2019 12:04 \u0645 \u0627\u0644\u062B\u0644\u0627\u062B\u0627\u0621"},
|
||||||
|
{"43466.189571759256", "[$-404]g\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u5e74\u0031\u6708\u0031\u65e5"},
|
||||||
|
{"43466.189571759256", "[$-404]e\"年\"m\"月\"d\"日\";@", "\u0031\u0030\u0038\u5e74\u0031\u6708\u0031\u65e5"},
|
||||||
|
{"43466.189571759256", "[$-404]ge\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u0031\u0030\u0038\u5e74\u0031\u6708\u0031\u65e5"},
|
||||||
|
{"43466.189571759256", "[$-404]gge\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u0031\u0030\u0038\u5e74\u0031\u6708\u0031\u65e5"},
|
||||||
|
{"43466.189571759256", "[$-404]ggge\"年\"m\"月\"d\"日\";@", "\u4e2d\u83ef\u6c11\u570b\u0031\u0030\u0038\u5e74\u0031\u6708\u0031\u65e5"},
|
||||||
|
{"43466.189571759256", "[$-404]gggge\"年\"m\"月\"d\"日\";@", "\u4e2d\u83ef\u6c11\u570b\u0031\u0030\u0038\u5e74\u0031\u6708\u0031\u65e5"},
|
||||||
|
{"4385.5083333333332", "[$-404]ge\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u5143\u5e74\u0031\u6708\u0032\u65e5"},
|
||||||
|
{"4385.5083333333332", "[$-404]gge\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u5143\u5e74\u0031\u6708\u0032\u65e5"},
|
||||||
|
{"4385.5083333333332", "[$-404]ggge\"年\"m\"月\"d\"日\";@", "\u4e2d\u83ef\u6c11\u570b\u5143\u5e74\u0031\u6708\u0032\u65e5"},
|
||||||
|
{"4385.5083333333332", "[$-404]gggge\"年\"m\"月\"d\"日\";@", "\u4e2d\u83ef\u6c11\u570b\u5143\u5e74\u0031\u6708\u0032\u65e5"},
|
||||||
|
{"123", "[$-404]ge\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u524d\u0031\u0032\u5e74\u0035\u6708\u0032\u65e5"},
|
||||||
|
{"123", "[$-404]gge\"年\"m\"月\"d\"日\";@", "\u6c11\u570b\u524d\u0031\u0032\u5e74\u0035\u6708\u0032\u65e5"},
|
||||||
|
{"123", "[$-404]ggge\"年\"m\"月\"d\"日\";@", "\u4e2d\u83ef\u6c11\u570b\u524d\u0031\u0032\u5e74\u0035\u6708\u0032\u65e5"},
|
||||||
|
{"123", "[$-404]gggge\"年\"m\"月\"d\"日\";@", "\u4e2d\u83ef\u6c11\u570b\u524d\u0031\u0032\u5e74\u0035\u6708\u0032\u65e5"},
|
||||||
{"44562.189571759256", "[$-1010401]mmm dd yyyy h:mm AM/PM", "\u064A\u0646\u0627\u064A\u0631 01 2022 4:32 \u0635"},
|
{"44562.189571759256", "[$-1010401]mmm dd yyyy h:mm AM/PM", "\u064A\u0646\u0627\u064A\u0631 01 2022 4:32 \u0635"},
|
||||||
{"44562.189571759256", "[$-1010401]mmmm dd yyyy h:mm AM/PM", "\u064A\u0646\u0627\u064A\u0631 01 2022 4:32 \u0635"},
|
{"44562.189571759256", "[$-1010401]mmmm dd yyyy h:mm AM/PM", "\u064A\u0646\u0627\u064A\u0631 01 2022 4:32 \u0635"},
|
||||||
{"44562.189571759256", "[$-1010401]mmmmm dd yyyy h:mm AM/PM", "\u064A 01 2022 4:32 \u0635"},
|
{"44562.189571759256", "[$-1010401]mmmmm dd yyyy h:mm AM/PM", "\u064A 01 2022 4:32 \u0635"},
|
||||||
|
@ -2722,6 +2736,9 @@ func TestNumFmt(t *testing.T) {
|
||||||
{"44835.18957170139", "[$-41E]mmmmm dd yyyy h:mm AM/PM aaa", "\u0e15 01 2022 4:32 AM \u0E2A."},
|
{"44835.18957170139", "[$-41E]mmmmm dd yyyy h:mm AM/PM aaa", "\u0e15 01 2022 4:32 AM \u0E2A."},
|
||||||
{"44866.18957170139", "[$-41E]mmmmm dd yyyy h:mm AM/PM ddd", "\u0e1e 01 2022 4:32 AM \u0E2D."},
|
{"44866.18957170139", "[$-41E]mmmmm dd yyyy h:mm AM/PM ddd", "\u0e1e 01 2022 4:32 AM \u0E2D."},
|
||||||
{"44896.18957170139", "[$-41E]mmmmm dd yyyy h:mm AM/PM dddd", "\u0e18 01 2022 4:32 AM \u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35"},
|
{"44896.18957170139", "[$-41E]mmmmm dd yyyy h:mm AM/PM dddd", "\u0e18 01 2022 4:32 AM \u0E1E\u0E24\u0E2B\u0E31\u0E2A\u0E1A\u0E14\u0E35"},
|
||||||
|
{"100", "g\"年\"m\"月\"d\"日\";@", "年4月9日"},
|
||||||
|
{"100", "e\"年\"m\"月\"d\"日\";@", "1900年4月9日"},
|
||||||
|
{"100", "ge\"年\"m\"月\"d\"日\";@", "1900年4月9日"},
|
||||||
{"100", "[$-411]ge\"年\"m\"月\"d\"日\";@", "1900年4月9日"},
|
{"100", "[$-411]ge\"年\"m\"月\"d\"日\";@", "1900年4月9日"},
|
||||||
{"43709", "[$-411]ge\"年\"m\"月\"d\"日\";@", "R1年9月1日"},
|
{"43709", "[$-411]ge\"年\"m\"月\"d\"日\";@", "R1年9月1日"},
|
||||||
{"43709", "[$-411]gge\"年\"m\"月\"d\"日\";@", "\u4EE41年9月1日"},
|
{"43709", "[$-411]gge\"年\"m\"月\"d\"日\";@", "\u4EE41年9月1日"},
|
||||||
|
|
Loading…
Reference in New Issue