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.
|
||||
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()
|
||||
return num.IsInt64() && num.Int64() == i
|
||||
}
|
||||
|
@ -156,7 +156,7 @@ func (n Number) Is(i int64) bool {
|
|||
|
||||
// IsUint retourne vrai si n = u.
|
||||
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()
|
||||
return num.IsUint64() && num.Uint64() == u
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ func (n Number) IsUint(u uint64) bool {
|
|||
|
||||
// IsFloat retourne vrai si n = f.
|
||||
func (n Number) IsFloat(f float64) bool {
|
||||
if nb, ok := n.get(); ok {
|
||||
if nb, ok := n.rat(); ok {
|
||||
nf, ok := nb.Float64()
|
||||
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.
|
||||
func (n Number) ToInt64() (i int64, ok bool) {
|
||||
var nb *big.Rat
|
||||
if nb, ok = n.get(); ok {
|
||||
if nb, ok = n.rat(); ok {
|
||||
if ok = nb.IsInt(); ok {
|
||||
num := nb.Num()
|
||||
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.
|
||||
func (n Number) ToUint64() (u uint64, ok bool) {
|
||||
var nb *big.Rat
|
||||
if nb, ok = n.get(); ok {
|
||||
if nb, ok = n.rat(); ok {
|
||||
if ok = nb.IsInt(); ok {
|
||||
num := nb.Num()
|
||||
if ok = num.IsUint64(); ok {
|
||||
|
@ -222,6 +222,16 @@ func (n Number) ToUint64() (u uint64, ok bool) {
|
|||
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.
|
||||
func (n Number) IsEven() bool {
|
||||
if nb, ok := n.get(); ok {
|
||||
|
@ -611,7 +621,7 @@ func (n Number) Fact() Number {
|
|||
default:
|
||||
out := One(n.Base())
|
||||
for e := Two(); e.Le(n); e = e.Inc() {
|
||||
out.Mul(e)
|
||||
out = out.Mul(e)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
@ -672,15 +682,20 @@ func (n Number) decString() (out string) {
|
|||
dot := len(out) - p
|
||||
out = fmt.Sprintf("%s.%s", out[:dot], out[dot:])
|
||||
|
||||
for out[0] == '0' {
|
||||
out = out[1:]
|
||||
}
|
||||
|
||||
if !FixedPrecision {
|
||||
l := len(out) - 1
|
||||
for out[l] == '0' {
|
||||
out, l = out[:l], l-1
|
||||
}
|
||||
}
|
||||
|
||||
if out == "." {
|
||||
out = "0."
|
||||
}
|
||||
}
|
||||
|
||||
if sign < 0 {
|
||||
out = fmt.Sprintf("-%s", out)
|
||||
|
|
|
@ -144,11 +144,6 @@ func Median(numbers ...Number) Number {
|
|||
}
|
||||
|
||||
numbers = Sort(numbers...)
|
||||
if l&1 == 0 {
|
||||
i := l >> 1
|
||||
return numbers[i].Add(numbers[i-1]).Div(Two())
|
||||
}
|
||||
|
||||
return numbers[l>>1]
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
package option
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Option permet de définir des valeurs alternative.
|
||||
type Choice[T1 any, T2 any] struct {
|
||||
left Option[T1]
|
||||
|
@ -44,3 +48,16 @@ func (c Choice[T1, T2]) IsRight() bool {
|
|||
func (c Choice[T1, T2]) IsNil() bool {
|
||||
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
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
)
|
||||
|
||||
// Option permet de définir des valeurs optionnelles, afin de se passer de nil.
|
||||
type Option[T any] struct {
|
||||
v T
|
||||
|
@ -29,3 +33,10 @@ func (o Option[T]) Get() (v T, ok bool) {
|
|||
func (o Option[T]) IsDefined() bool {
|
||||
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