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
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 |