Skip to content

Commit 9e884c7

Browse files
authored
This closes qax-os#1847, support apply number format with alignment (qax-os#1852)
- Update dependencies module - Update unit tests
1 parent 4eb088c commit 9e884c7

File tree

5 files changed

+48
-18
lines changed

5 files changed

+48
-18
lines changed

excelize_test.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -742,11 +742,11 @@ func TestSetCellStyleNumberFormat(t *testing.T) {
742742
idxTbl := []int{0, 1, 2, 3, 4, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49}
743743
value := []string{"37947.7500001", "-37947.7500001", "0.007", "2.1", "String"}
744744
expected := [][]string{
745-
{"37947.7500001", "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"},
746-
{"-37947.7500001", "-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"},
747-
{"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"},
748-
{"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"},
749-
{"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"},
745+
{"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"},
746+
{"-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"},
747+
{"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"},
748+
{"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"},
749+
{"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"},
750750
}
751751

752752
for c, v := range value {

go.mod

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ require (
77
github.com/richardlehane/mscfb v1.0.4
88
github.com/stretchr/testify v1.8.4
99
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53
10-
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05
11-
golang.org/x/crypto v0.19.0
10+
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7
11+
golang.org/x/crypto v0.21.0
1212
golang.org/x/image v0.14.0
13-
golang.org/x/net v0.21.0
13+
golang.org/x/net v0.22.0
1414
golang.org/x/text v0.14.0
1515
)
1616

go.sum

+8
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,20 @@ github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1
1515
github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
1616
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
1717
github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
18+
github.com/xuri/nfp v0.0.0-20240316161844-5bacf1a74267 h1:p0lQ21ogqdVWcdXpqSlD7gu/3whO1YWNiOaPJNBfunU=
19+
github.com/xuri/nfp v0.0.0-20240316161844-5bacf1a74267/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
20+
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
21+
github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
1822
golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
1923
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
24+
golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
25+
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
2026
golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
2127
golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
2228
golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
2329
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
30+
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
31+
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
2432
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
2533
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
2634
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=

numfmt.go

+23-6
Original file line numberDiff line numberDiff line change
@@ -682,6 +682,7 @@ var (
682682
}
683683
// supportedTokenTypes list the supported number format token types currently.
684684
supportedTokenTypes = []string{
685+
nfp.TokenTypeAlignment,
685686
nfp.TokenSubTypeCurrencyString,
686687
nfp.TokenSubTypeLanguageInfo,
687688
nfp.TokenTypeColor,
@@ -4797,14 +4798,14 @@ func format(value, numFmt string, date1904 bool, cellType CellType, opts *Option
47974798
if nf.isNumeric {
47984799
switch section.Type {
47994800
case nfp.TokenSectionPositive:
4800-
return nf.positiveHandler()
4801+
return nf.alignmentHandler(nf.positiveHandler())
48014802
case nfp.TokenSectionNegative:
4802-
return nf.negativeHandler()
4803+
return nf.alignmentHandler(nf.negativeHandler())
48034804
default:
4804-
return nf.zeroHandler()
4805+
return nf.alignmentHandler(nf.zeroHandler())
48054806
}
48064807
}
4807-
return nf.textHandler()
4808+
return nf.alignmentHandler(nf.textHandler())
48084809
}
48094810
return value
48104811
}
@@ -5082,13 +5083,29 @@ func (nf *numberFormat) dateTimeHandler() string {
50825083
return nf.printSwitchArgument(nf.result)
50835084
}
50845085

5086+
// alignmentHandler will be handling alignment token for each number format
5087+
// selection for a number format expression.
5088+
func (nf *numberFormat) alignmentHandler(result string) string {
5089+
tokens := nf.section[nf.sectionIdx].Items
5090+
if len(tokens) == 0 {
5091+
return result
5092+
}
5093+
if tokens[0].TType == nfp.TokenTypeAlignment {
5094+
result = nfp.Whitespace + result
5095+
}
5096+
if l := len(tokens); tokens[l-1].TType == nfp.TokenTypeAlignment {
5097+
result += nfp.Whitespace
5098+
}
5099+
return result
5100+
}
5101+
50855102
// positiveHandler will be handling positive selection for a number format
50865103
// expression.
50875104
func (nf *numberFormat) positiveHandler() string {
50885105
var fmtNum bool
50895106
for _, token := range nf.section[nf.sectionIdx].Items {
5090-
if inStrSlice(supportedTokenTypes, token.TType, true) == -1 || token.TType == nfp.TokenTypeGeneral {
5091-
return nf.value
5107+
if token.TType == nfp.TokenTypeGeneral {
5108+
return strconv.FormatFloat(nf.number, 'G', 10, 64)
50925109
}
50935110
if inStrSlice(supportedNumberTokenTypes, token.TType, true) != -1 {
50945111
fmtNum = true

numfmt_test.go

+9-4
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@ func TestNumFmt(t *testing.T) {
1111
for _, item := range [][]string{
1212
{"123", "general", "123"},
1313
{"-123", ";general", "-123"},
14+
{"43543.5448726851", "General", "43543.54487"},
15+
{"-43543.5448726851", "General", "-43543.54487"},
16+
{"1234567890.12345", "General", "1234567890"},
1417
{"43528", "y", "19"},
1518
{"43528", "Y", "19"},
1619
{"43528", "yy", "19"},
@@ -3488,14 +3491,16 @@ func TestNumFmt(t *testing.T) {
34883491
{"43543.503206018519", "[$-F400]h:mm:ss AM/PM", "12:04:37 PM"},
34893492
{"text_", "General", "text_"},
34903493
{"text_", "\"=====\"@@@\"--\"@\"----\"", "=====text_text_text_--text_----"},
3491-
{"0.0450685976001E+21", "0_);[Red]\\(0\\)", "45068597600100000000"},
3492-
{"8.0450685976001E+21", "0_);[Red]\\(0\\)", "8045068597600100000000"},
3493-
{"8.0450685976001E-21", "0_);[Red]\\(0\\)", "0"},
3494-
{"8.04506", "0_);[Red]\\(0\\)", "8"},
3494+
{"0.0450685976001E+21", "0_);[Red]\\(0\\)", "45068597600100000000 "},
3495+
{"8.0450685976001E+21", "0_);[Red]\\(0\\)", "8045068597600100000000 "},
3496+
{"8.0450685976001E-21", "0_);[Red]\\(0\\)", "0 "},
3497+
{"8.04506", "0_);[Red]\\(0\\)", "8 "},
34953498
{"-0.0450685976001E+21", "0_);[Red]\\(0\\)", "(45068597600100000000)"},
34963499
{"-8.0450685976001E+21", "0_);[Red]\\(0\\)", "(8045068597600100000000)"},
34973500
{"-8.0450685976001E-21", "0_);[Red]\\(0\\)", "(0)"},
34983501
{"-8.04506", "0_);[Red]\\(0\\)", "(8)"},
3502+
{"-8.04506", "$#,##0.00_);[Red]($#,##0.00)", "($8.05)"},
3503+
{"43543.5448726851", `_("$"* #,##0.00_);_("$"* \(#,##0.00\);_("$"* "-"??_);_(@_)`, " $43,543.54 "},
34993504
{"1234.5678", "0", "1235"},
35003505
{"1234.5678", "0.00", "1234.57"},
35013506
{"1234.5678", "#,##0", "1,235"},

0 commit comments

Comments
 (0)