Skip to content

Commit c313c7c

Browse files
authored
feat: add comparison utilities (#35)
1 parent fe59b7f commit c313c7c

File tree

3 files changed

+188
-32
lines changed

3 files changed

+188
-32
lines changed

decimal.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,49 @@ func (d Decimal) Equal(e Decimal) bool {
742742
return d.Cmp(e) == 0
743743
}
744744

745+
// LessThan reports whether d < e.
746+
func (d Decimal) LessThan(e Decimal) bool {
747+
return d.Cmp(e) == -1
748+
}
749+
750+
// LessThanOrEqual reports whether d <= e.
751+
func (d Decimal) LessThanOrEqual(e Decimal) bool {
752+
return d.Cmp(e) <= 0
753+
}
754+
755+
// GreaterThan reports whether d > e.
756+
func (d Decimal) GreaterThan(e Decimal) bool {
757+
return d.Cmp(e) == 1
758+
}
759+
760+
// GreaterThanOrEqual reports whether d >= e.
761+
func (d Decimal) GreaterThanOrEqual(e Decimal) bool {
762+
return d.Cmp(e) >= 0
763+
}
764+
765+
// Max returns the maximum decimal from the list of decimals.
766+
func Max(a Decimal, b ...Decimal) Decimal {
767+
result := a
768+
for _, v := range b {
769+
if v.GreaterThan(result) {
770+
result = v
771+
}
772+
}
773+
774+
return result
775+
}
776+
777+
func Min(a Decimal, b ...Decimal) Decimal {
778+
result := a
779+
for _, v := range b {
780+
if v.LessThan(result) {
781+
result = v
782+
}
783+
}
784+
785+
return result
786+
}
787+
745788
func (d Decimal) cmpDecSameSign(e Decimal) int {
746789
result, err := tryCmpU128(d, e)
747790
if err == nil {

decimal_test.go

Lines changed: 93 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,36 +1275,40 @@ func TestCmp(t *testing.T) {
12751275
}
12761276
}
12771277

1278-
func TestEqual(t *testing.T) {
1278+
func TestComparisionUtils(t *testing.T) {
12791279
testcases := []struct {
1280-
a, b string
1281-
want bool
1280+
a, b string
1281+
wantEqual bool
1282+
wantLT bool
1283+
wantLTE bool
1284+
wantGT bool
1285+
wantGTE bool
12821286
}{
1283-
{"1234567890123456789", "0", false},
1284-
{"123.123", "-123.123", false},
1285-
{"-123.123", "123.123", false},
1286-
{"-123.123", "-123.123", true},
1287-
{"-123.123", "-123.1234567890123456789", false},
1288-
{"123.123", "123.1234567890123456789", false},
1289-
{"123.123", "123.1230000000000000001", false},
1290-
{"-123.123", "-123.1230000000000000001", false},
1291-
{"123.1230000000000000002", "123.1230000000000000001", false},
1292-
{"-123.1230000000000000002", "-123.1230000000000000001", false},
1293-
{"123.1230000000000000002", "123.123000000001", false},
1294-
{"-123.1230000000000000002", "-123.123000000001", false},
1295-
{"123.123", "123.1230000", true},
1296-
{"123.101", "123.1001", false},
1297-
{"1000000000000000000000000.1234567890123456789", "1.1234567890123456789", false},
1298-
{"-1000000000000000000000000.1234567890123456789", "1.1234567890123456789", false},
1299-
{"-1000000000000000000000000.1234567890123456789", "-1.1234567890123456789", false},
1300-
{"1000000000000000000000000.1234567890123456789", "1000000000000000000000000.1234567890123456789", true},
1301-
{"-1000000000000000000000000.1234567890123456789", "-1000000000000000000000000.1234567890123456789", true},
1302-
{"1000000000000000000000000.1234567890123456789", "1000000000000000000000000.1234567890123456788", false},
1303-
{"-1000000000000000000000000.1234567890123456789", "-1000000000000000000000000.1234567890123456788", false},
1304-
{"1000000000000000000000000.12345678901234", "1000000000000000000000000.1234567890123456788", false},
1305-
{"-1000000000000000000000000.12345678901234", "-1000000000000000000000000.1234567890123456788", false},
1306-
{"1000000000000000000000000.1234567890123456788", "1000000000000000000000000.12345678901234", false},
1307-
{"-1000000000000000000000000.1234567890123456788", "-1000000000000000000000000.12345678901234", false},
1287+
{"1234567890123456789", "0", false, false, false, true, true},
1288+
{"123.123", "-123.123", false, false, false, true, true},
1289+
{"-123.123", "123.123", false, true, true, false, false},
1290+
{"-123.123", "-123.123", true, false, true, false, true},
1291+
{"-123.123", "-123.1234567890123456789", false, false, false, true, true},
1292+
{"123.123", "123.1234567890123456789", false, true, true, false, false},
1293+
{"123.123", "123.1230000000000000001", false, true, true, false, false},
1294+
{"-123.123", "-123.1230000000000000001", false, false, false, true, true},
1295+
{"123.1230000000000000002", "123.1230000000000000001", false, false, false, true, true},
1296+
{"-123.1230000000000000002", "-123.1230000000000000001", false, true, true, false, false},
1297+
{"123.1230000000000000002", "123.123000000001", false, true, true, false, false},
1298+
{"-123.1230000000000000002", "-123.123000000001", false, false, false, true, true},
1299+
{"123.123", "123.1230000", true, false, true, false, true},
1300+
{"123.101", "123.1001", false, false, false, true, true},
1301+
{"1000000000000000000000000.1234567890123456789", "1.1234567890123456789", false, false, false, true, true},
1302+
{"-1000000000000000000000000.1234567890123456789", "1.1234567890123456789", false, true, true, false, false},
1303+
{"-1000000000000000000000000.1234567890123456789", "-1.1234567890123456789", false, true, true, false, false},
1304+
{"1000000000000000000000000.1234567890123456789", "1000000000000000000000000.1234567890123456789", true, false, true, false, true},
1305+
{"-1000000000000000000000000.1234567890123456789", "-1000000000000000000000000.1234567890123456789", true, false, true, false, true},
1306+
{"1000000000000000000000000.1234567890123456789", "1000000000000000000000000.1234567890123456788", false, false, false, true, true},
1307+
{"-1000000000000000000000000.1234567890123456789", "-1000000000000000000000000.1234567890123456788", false, true, true, false, false},
1308+
{"1000000000000000000000000.12345678901234", "1000000000000000000000000.1234567890123456788", false, true, true, false, false},
1309+
{"-1000000000000000000000000.12345678901234", "-1000000000000000000000000.1234567890123456788", false, false, false, true, true},
1310+
{"1000000000000000000000000.1234567890123456788", "1000000000000000000000000.12345678901234", false, false, false, true, true},
1311+
{"-1000000000000000000000000.1234567890123456788", "-1000000000000000000000000.12345678901234", false, true, true, false, false},
13081312
}
13091313

13101314
for _, tc := range testcases {
@@ -1315,19 +1319,76 @@ func TestEqual(t *testing.T) {
13151319
b, err := Parse(tc.b)
13161320
require.NoError(t, err)
13171321

1318-
c := a.Equal(b)
1319-
require.Equal(t, tc.want, c)
1320-
1321-
// compare with shopspring/decimal
13221322
aa := decimal.RequireFromString(tc.a)
13231323
bb := decimal.RequireFromString(tc.b)
13241324

1325+
// test equal
1326+
c := a.Equal(b)
13251327
cc := aa.Equal(bb)
1328+
require.Equal(t, tc.wantEqual, c)
1329+
require.Equal(t, cc, c)
1330+
1331+
// test less than
1332+
c = a.LessThan(b)
1333+
cc = aa.LessThan(bb)
1334+
require.Equal(t, tc.wantLT, c)
1335+
require.Equal(t, cc, c)
1336+
1337+
// test less than or equal
1338+
c = a.LessThanOrEqual(b)
1339+
cc = aa.LessThanOrEqual(bb)
1340+
require.Equal(t, tc.wantLTE, c)
1341+
require.Equal(t, cc, c)
1342+
1343+
// test greater than
1344+
c = a.GreaterThan(b)
1345+
cc = aa.GreaterThan(bb)
1346+
require.Equal(t, tc.wantGT, c)
1347+
require.Equal(t, cc, c)
1348+
1349+
// test greater than or equal
1350+
c = a.GreaterThanOrEqual(b)
1351+
cc = aa.GreaterThanOrEqual(bb)
1352+
require.Equal(t, tc.wantGTE, c)
13261353
require.Equal(t, cc, c)
13271354
})
13281355
}
13291356
}
13301357

1358+
func TestMaxMin(t *testing.T) {
1359+
testcases := []struct {
1360+
list []string
1361+
wantMax string
1362+
wantMin string
1363+
}{
1364+
{[]string{"1234567890123456789", "0", "1234567890123456789", "1234567890123456789"}, "1234567890123456789", "0"},
1365+
{[]string{"123.123", "-123.123", "123.123", "-123.123"}, "123.123", "-123.123"},
1366+
{[]string{"-1235.123124235235", "0.11", "5345.29809824", "-6465465.45646"}, "5345.29809824", "-6465465.45646"},
1367+
{[]string{"1.123", "2.235"}, "2.235", "1.123"},
1368+
{[]string{"-1.123", "-2.235"}, "-1.123", "-2.235"},
1369+
{[]string{"1.123"}, "1.123", "1.123"},
1370+
}
1371+
1372+
for _, tc := range testcases {
1373+
t.Run(fmt.Sprintf("%v", tc.list), func(t *testing.T) {
1374+
list := make([]Decimal, len(tc.list))
1375+
for i, s := range tc.list {
1376+
d, err := Parse(s)
1377+
require.NoError(t, err)
1378+
list[i] = d
1379+
}
1380+
1381+
// test max
1382+
expectedMax := Max(list[0], list[1:]...)
1383+
require.Equal(t, tc.wantMax, expectedMax.String())
1384+
1385+
// test min
1386+
expectedMin := Min(list[0], list[1:]...)
1387+
require.Equal(t, tc.wantMin, expectedMin.String())
1388+
})
1389+
}
1390+
}
1391+
13311392
func TestCmpWithDifferentPrecision(t *testing.T) {
13321393
testcases := []struct {
13331394
a1, a2, b string

doc_test.go

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,58 @@ func ExampleDecimal_Cmp() {
146146
// 1
147147
}
148148

149+
func ExampleDecimal_LessThan() {
150+
fmt.Println(MustParse("1.23").LessThan(MustParse("4.12475")))
151+
fmt.Println(MustParse("1.23").LessThan(MustParse("1.23")))
152+
fmt.Println(MustParse("1.23").LessThan(MustParse("0.12475")))
153+
// Output:
154+
// true
155+
// false
156+
// false
157+
}
158+
159+
func ExampleDecimal_LessThanOrEqual() {
160+
fmt.Println(MustParse("1.23").LessThanOrEqual(MustParse("4.12475")))
161+
fmt.Println(MustParse("1.23").LessThanOrEqual(MustParse("1.23")))
162+
fmt.Println(MustParse("1.23").LessThanOrEqual(MustParse("0.12475")))
163+
// Output:
164+
// true
165+
// true
166+
// false
167+
}
168+
169+
func ExampleDecimal_GreaterThan() {
170+
fmt.Println(MustParse("1.23").GreaterThan(MustParse("4.12475")))
171+
fmt.Println(MustParse("1.23").GreaterThan(MustParse("1.23")))
172+
fmt.Println(MustParse("1.23").GreaterThan(MustParse("0.12475")))
173+
// Output:
174+
// false
175+
// false
176+
// true
177+
}
178+
179+
func ExampleDecimal_GreaterThanOrEqual() {
180+
fmt.Println(MustParse("1.23").GreaterThanOrEqual(MustParse("4.12475")))
181+
fmt.Println(MustParse("1.23").GreaterThanOrEqual(MustParse("1.23")))
182+
fmt.Println(MustParse("1.23").GreaterThanOrEqual(MustParse("0.12475")))
183+
// Output:
184+
// false
185+
// true
186+
// true
187+
}
188+
189+
func ExampleMax() {
190+
fmt.Println(Max(MustParse("1.23"), MustParse("4.12475")))
191+
// Output:
192+
// 4.12475
193+
}
194+
195+
func ExampleMin() {
196+
fmt.Println(Min(MustParse("1.23"), MustParse("4.12475")))
197+
// Output:
198+
// 1.23
199+
}
200+
149201
func ExampleDecimal_Equal() {
150202
fmt.Println(MustParse("1.123").Equal(MustParse("-1.123")))
151203
fmt.Println(MustParse("1.123").Equal(MustParse("1.1230000")))

0 commit comments

Comments
 (0)