120 lines
2.1 KiB
Go
120 lines
2.1 KiB
Go
package biginthelper
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"math/big"
|
|
"strings"
|
|
)
|
|
|
|
// BigIntString BigIntString
|
|
func BigIntString(balance *big.Int, decimals int64) string {
|
|
amount := BigIntFloat(balance, decimals)
|
|
deci := fmt.Sprintf("%%0.%vf", decimals)
|
|
return clean(fmt.Sprintf(deci, amount))
|
|
}
|
|
|
|
// BigIntFloat BigIntFloat
|
|
func BigIntFloat(balance *big.Int, decimals int64) *big.Float {
|
|
if balance.Sign() == 0 {
|
|
return big.NewFloat(0)
|
|
}
|
|
bal := new(big.Float)
|
|
bal.SetInt(balance)
|
|
pow := bigPow(10, decimals)
|
|
p := big.NewFloat(0)
|
|
p.SetInt(pow)
|
|
bal.Quo(bal, p)
|
|
return bal
|
|
}
|
|
|
|
func bigPow(a, b int64) *big.Int {
|
|
r := big.NewInt(a)
|
|
return r.Exp(r, big.NewInt(b), nil)
|
|
}
|
|
|
|
func clean(newNum string) string {
|
|
stringBytes := bytes.TrimRight([]byte(newNum), "0")
|
|
newNum = string(stringBytes)
|
|
if stringBytes[len(stringBytes)-1] == 46 {
|
|
newNum += "0"
|
|
}
|
|
if stringBytes[0] == 46 {
|
|
newNum = "0" + newNum
|
|
}
|
|
return newNum
|
|
}
|
|
|
|
// GetActualHex 获取真实的十六进制..
|
|
func GetActualHex(h string) string {
|
|
h = strings.TrimLeft(h, "0")
|
|
var hex string
|
|
if strings.Index(h, "0x") == 0 {
|
|
hex = h[2:]
|
|
} else {
|
|
hex = h
|
|
}
|
|
if len(h)%2 != 0 {
|
|
hex = "0" + hex
|
|
}
|
|
return "0x" + hex
|
|
}
|
|
|
|
// HexToBig HexToBig
|
|
func HexToBig(h string) *big.Int {
|
|
i := big.NewInt(0)
|
|
h = strings.Replace(h, "0x", "", -1)
|
|
if h == "" {
|
|
return i
|
|
}
|
|
if _, ok := i.SetString(h, 16); !ok {
|
|
return nil
|
|
}
|
|
return i
|
|
}
|
|
|
|
// ConvertNumToFloat ConvertNumToFloat
|
|
func ConvertNumToFloat(num int64) float64 {
|
|
switch num {
|
|
case 1:
|
|
return 10.0
|
|
case 2:
|
|
return 100.0
|
|
case 3:
|
|
return 1000.0
|
|
case 4:
|
|
return 10000.0
|
|
case 5:
|
|
return 100000.0
|
|
case 6:
|
|
return 1000000.0
|
|
case 7:
|
|
return 10000000.0
|
|
case 8:
|
|
return 100000000.0
|
|
case 9:
|
|
return 1000000000.0
|
|
case 10:
|
|
return 10000000000.0
|
|
case 11:
|
|
return 100000000000.0
|
|
case 12:
|
|
return 1000000000000.0
|
|
case 13:
|
|
return 10000000000000.0
|
|
case 14:
|
|
return 100000000000000.0
|
|
case 15:
|
|
return 1000000000000000.0
|
|
case 16:
|
|
return 10000000000000000.0
|
|
case 17:
|
|
return 100000000000000000.0
|
|
case 18:
|
|
return 1000000000000000000.0
|
|
default:
|
|
return 0.0
|
|
}
|
|
|
|
}
|