diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000000..3ba13e0cec --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false diff --git a/numfmt.go b/numfmt.go index d8a9937626..878ec99974 100644 --- a/numfmt.go +++ b/numfmt.go @@ -4962,37 +4962,54 @@ func (nf *numberFormat) getNumberFmtConf() { } } +// handleDigitsLiteral apply hash and zero place holder tokens for the number +// literal. +func handleDigitsLiteral(text string, tokenValueLen, intPartLen, hashZeroPartLen int) (int, string) { + var result string + l := tokenValueLen + if intPartLen == 0 && len(text) > hashZeroPartLen { + l = len(text) + tokenValueLen - hashZeroPartLen + } + if len(text) < hashZeroPartLen { + intPartLen += len(text) - hashZeroPartLen + } + for i := 0; i < l; i++ { + j := i + intPartLen + if 0 <= j && j < len([]rune(text)) { + result += string([]rune(text)[j]) + } + } + return l, result +} + // printNumberLiteral apply literal tokens for the pre-formatted text. func (nf *numberFormat) printNumberLiteral(text string) string { var ( - result string - frac float64 - useFraction, useLiteral, usePlaceHolder bool + result string + frac float64 + useFraction bool + intPartLen, hashZeroPartLen int ) if nf.usePositive { result += "-" } + for _, token := range nf.section[nf.sectionIdx].Items { + if token.TType == nfp.TokenTypeHashPlaceHolder || token.TType == nfp.TokenTypeZeroPlaceHolder { + hashZeroPartLen += len(token.TValue) + } + } for _, token := range nf.section[nf.sectionIdx].Items { if token.TType == nfp.TokenTypeCurrencyLanguage { - if changeNumFmtCode, err := nf.currencyLanguageHandler(token); err != nil || changeNumFmtCode { - return nf.value - } + _, _ = nf.currencyLanguageHandler(token) result += nf.currencyString } if token.TType == nfp.TokenTypeLiteral { - if usePlaceHolder { - useLiteral = true - } result += token.TValue } if token.TType == nfp.TokenTypeHashPlaceHolder || token.TType == nfp.TokenTypeZeroPlaceHolder { - if useLiteral && usePlaceHolder { - return nf.value - } - if !usePlaceHolder { - usePlaceHolder = true - result += text - } + digits, str := handleDigitsLiteral(text, len(token.TValue), intPartLen, hashZeroPartLen) + intPartLen += digits + result += str } if token.TType == nfp.TokenTypeFraction { _, frac = math.Modf(nf.number) @@ -5257,6 +5274,7 @@ func (nf *numberFormat) currencyLanguageHandler(token nfp.Token) (bool, error) { } if part.Token.TType == nfp.TokenSubTypeCurrencyString { nf.currencyString = part.Token.TValue + return false, nil } } return false, nil diff --git a/numfmt_test.go b/numfmt_test.go index 158104755e..05971d3dc5 100644 --- a/numfmt_test.go +++ b/numfmt_test.go @@ -3631,10 +3631,12 @@ func TestNumFmt(t *testing.T) { {"-123.4567", "#\\ ?/100", "-123 46/100"}, {"123.4567", "#\\ ?/1000", "123 457/1000"}, {"1234.5678", "[$$-409]#,##0.00", "$1,234.57"}, + {"123", "[$x.-unknown]#,##0.00", "x.123.00"}, + {"123", "[$x.-unknown]MM/DD/YYYY", "x.05/02/1900"}, + {"1234.5678", "0.0xxx00", "1234.5xxx68"}, + {"80145.899999999994", "[$¥-8004]\" \"#\" \"####\"\"", "¥ 8 0146"}, // Unsupported number format {"37947.7500001", "0.00000000E+000", "37947.7500001"}, - {"123", "[$x.-unknown]#,##0.00", "123"}, - {"123", "[$x.-unknown]MM/DD/YYYY", "123"}, {"123", "[DBNum4][$-804]yyyy\"年\"m\"月\";@", "123"}, // Invalid number format {"123", "x0.00s", "123"}, @@ -3646,7 +3648,6 @@ func TestNumFmt(t *testing.T) { {"-1234.5678", ";E+;", "-1234.5678"}, {"1234.5678", "E+;", "1234.5678"}, {"1234.5678", "00000.00###s", "1234.5678"}, - {"1234.5678", "0.0xxx00", "1234.5678"}, {"-1234.5678", "00000.00###;s;", "-1234.5678"}, } { result := format(item[0], item[1], false, CellTypeNumber, nil)