Corrections diverses du package number + Ajout de stringers pour opition.Option et option.Choice
This commit is contained in:
parent
eff6ae9d7e
commit
ec6a3ba492
|
@ -146,7 +146,7 @@ func (n Number) IsUint64() bool {
|
||||||
|
|
||||||
// Is retourne vrai si n = i.
|
// Is retourne vrai si n = i.
|
||||||
func (n Number) Is(i int64) bool {
|
func (n Number) Is(i int64) bool {
|
||||||
if nb, ok := n.get(); ok && nb.IsInt() {
|
if nb, ok := n.rat(); ok && nb.IsInt() {
|
||||||
num := nb.Num()
|
num := nb.Num()
|
||||||
return num.IsInt64() && num.Int64() == i
|
return num.IsInt64() && num.Int64() == i
|
||||||
}
|
}
|
||||||
|
@ -156,7 +156,7 @@ func (n Number) Is(i int64) bool {
|
||||||
|
|
||||||
// IsUint retourne vrai si n = u.
|
// IsUint retourne vrai si n = u.
|
||||||
func (n Number) IsUint(u uint64) bool {
|
func (n Number) IsUint(u uint64) bool {
|
||||||
if nb, ok := n.get(); ok && nb.IsInt() {
|
if nb, ok := n.rat(); ok && nb.IsInt() {
|
||||||
num := nb.Num()
|
num := nb.Num()
|
||||||
return num.IsUint64() && num.Uint64() == u
|
return num.IsUint64() && num.Uint64() == u
|
||||||
}
|
}
|
||||||
|
@ -166,7 +166,7 @@ func (n Number) IsUint(u uint64) bool {
|
||||||
|
|
||||||
// IsFloat retourne vrai si n = f.
|
// IsFloat retourne vrai si n = f.
|
||||||
func (n Number) IsFloat(f float64) bool {
|
func (n Number) IsFloat(f float64) bool {
|
||||||
if nb, ok := n.get(); ok {
|
if nb, ok := n.rat(); ok {
|
||||||
nf, ok := nb.Float64()
|
nf, ok := nb.Float64()
|
||||||
return nf == f && ok
|
return nf == f && ok
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ func (n Number) IsNan() bool { return !n.IsDefined() && n.Sign() == 0 }
|
||||||
// ToInt64 retourne le nombre converti en int64, et vrai si la conversion a réussi.
|
// ToInt64 retourne le nombre converti en int64, et vrai si la conversion a réussi.
|
||||||
func (n Number) ToInt64() (i int64, ok bool) {
|
func (n Number) ToInt64() (i int64, ok bool) {
|
||||||
var nb *big.Rat
|
var nb *big.Rat
|
||||||
if nb, ok = n.get(); ok {
|
if nb, ok = n.rat(); ok {
|
||||||
if ok = nb.IsInt(); ok {
|
if ok = nb.IsInt(); ok {
|
||||||
num := nb.Num()
|
num := nb.Num()
|
||||||
if ok = num.IsInt64(); ok {
|
if ok = num.IsInt64(); ok {
|
||||||
|
@ -210,7 +210,7 @@ func (n Number) ToInt64() (i int64, ok bool) {
|
||||||
// ToUint64 retourne le nombre converti en uint64, et vrai si la conversion a réussi.
|
// ToUint64 retourne le nombre converti en uint64, et vrai si la conversion a réussi.
|
||||||
func (n Number) ToUint64() (u uint64, ok bool) {
|
func (n Number) ToUint64() (u uint64, ok bool) {
|
||||||
var nb *big.Rat
|
var nb *big.Rat
|
||||||
if nb, ok = n.get(); ok {
|
if nb, ok = n.rat(); ok {
|
||||||
if ok = nb.IsInt(); ok {
|
if ok = nb.IsInt(); ok {
|
||||||
num := nb.Num()
|
num := nb.Num()
|
||||||
if ok = num.IsUint64(); ok {
|
if ok = num.IsUint64(); ok {
|
||||||
|
@ -222,6 +222,16 @@ func (n Number) ToUint64() (u uint64, ok bool) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ToFloat retourne le nombre converti en flottant, et vrai si la conversion a réussi et est exacte.
|
||||||
|
func (n Number) ToFloat() (f float64, ok bool) {
|
||||||
|
var nb *big.Rat
|
||||||
|
if nb, ok = n.rat(); ok {
|
||||||
|
f, ok = nb.Float64()
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// IsEven retourne vrai si n est entier et pair.
|
// IsEven retourne vrai si n est entier et pair.
|
||||||
func (n Number) IsEven() bool {
|
func (n Number) IsEven() bool {
|
||||||
if nb, ok := n.get(); ok {
|
if nb, ok := n.get(); ok {
|
||||||
|
@ -611,7 +621,7 @@ func (n Number) Fact() Number {
|
||||||
default:
|
default:
|
||||||
out := One(n.Base())
|
out := One(n.Base())
|
||||||
for e := Two(); e.Le(n); e = e.Inc() {
|
for e := Two(); e.Le(n); e = e.Inc() {
|
||||||
out.Mul(e)
|
out = out.Mul(e)
|
||||||
}
|
}
|
||||||
return out
|
return out
|
||||||
}
|
}
|
||||||
|
@ -672,14 +682,19 @@ func (n Number) decString() (out string) {
|
||||||
dot := len(out) - p
|
dot := len(out) - p
|
||||||
out = fmt.Sprintf("%s.%s", out[:dot], out[dot:])
|
out = fmt.Sprintf("%s.%s", out[:dot], out[dot:])
|
||||||
|
|
||||||
|
for out[0] == '0' {
|
||||||
|
out = out[1:]
|
||||||
|
}
|
||||||
|
|
||||||
if !FixedPrecision {
|
if !FixedPrecision {
|
||||||
l := len(out) - 1
|
l := len(out) - 1
|
||||||
for out[l] == '0' {
|
for out[l] == '0' {
|
||||||
out, l = out[:l], l-1
|
out, l = out[:l], l-1
|
||||||
}
|
}
|
||||||
if out == "." {
|
}
|
||||||
out = "0."
|
|
||||||
}
|
if out == "." {
|
||||||
|
out = "0."
|
||||||
}
|
}
|
||||||
|
|
||||||
if sign < 0 {
|
if sign < 0 {
|
||||||
|
|
|
@ -144,11 +144,6 @@ func Median(numbers ...Number) Number {
|
||||||
}
|
}
|
||||||
|
|
||||||
numbers = Sort(numbers...)
|
numbers = Sort(numbers...)
|
||||||
if l&1 == 0 {
|
|
||||||
i := l >> 1
|
|
||||||
return numbers[i].Add(numbers[i-1]).Div(Two())
|
|
||||||
}
|
|
||||||
|
|
||||||
return numbers[l>>1]
|
return numbers[l>>1]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
package option
|
package option
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
// Option permet de définir des valeurs alternative.
|
// Option permet de définir des valeurs alternative.
|
||||||
type Choice[T1 any, T2 any] struct {
|
type Choice[T1 any, T2 any] struct {
|
||||||
left Option[T1]
|
left Option[T1]
|
||||||
|
@ -44,3 +48,16 @@ func (c Choice[T1, T2]) IsRight() bool {
|
||||||
func (c Choice[T1, T2]) IsNil() bool {
|
func (c Choice[T1, T2]) IsNil() bool {
|
||||||
return !c.IsLeft() && !c.IsRight()
|
return !c.IsLeft() && !c.IsRight()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c Choice[T1, T2]) String() string {
|
||||||
|
return fmt.Sprintf(`{
|
||||||
|
left: {
|
||||||
|
value: %v,
|
||||||
|
ok: %v,
|
||||||
|
},
|
||||||
|
right: {
|
||||||
|
value: %v,
|
||||||
|
ok: %v,
|
||||||
|
},
|
||||||
|
}`, c.left.v, c.left.ok, c.right.v, c.right.ok)
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,9 @@
|
||||||
package option
|
package option
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
// Option permet de définir des valeurs optionnelles, afin de se passer de nil.
|
// Option permet de définir des valeurs optionnelles, afin de se passer de nil.
|
||||||
type Option[T any] struct {
|
type Option[T any] struct {
|
||||||
v T
|
v T
|
||||||
|
@ -29,3 +33,10 @@ func (o Option[T]) Get() (v T, ok bool) {
|
||||||
func (o Option[T]) IsDefined() bool {
|
func (o Option[T]) IsDefined() bool {
|
||||||
return o.ok
|
return o.ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (o Option[T]) String() string {
|
||||||
|
return fmt.Sprintf(`{
|
||||||
|
value: %v,
|
||||||
|
ok: %v,
|
||||||
|
}`, o.v, o.ok)
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue