币圈数值转换

我们经常可以在币安中看到,某交易对的成交量或者成交额都有一个M或者B的单位,那么本文带大家一起实现

一、疑问:

1. 数量单位B和M以及T代表多少?

  • B是单词billion的缩写,1B=10亿
  • M是单词million的缩写,1M=100万
  • T是单词trillion的缩写,1T=1万亿

币圈m代表单位百万,1M在国际通行的说法是1M=1百万,欧洲银行业管理局将虚拟货币定义为:价值的数字化表示,不由央行或当局发行,也不与货币挂钩,但由于被公众所接受,所以可作为支付手段,也可以电子形式转移、存储或交易。

二、代码实现

首先需要有一些string数据类型的加减乘除运算方法

func Calc(a string, b string, op int, pcs int) (string, error) {
	decimal.DivisionPrecision = pcs
	ad, err1 := decimal.NewFromString(a)
	bd, err2 := decimal.NewFromString(b)
	if err1 != nil || err2 != nil {
		return "0.00", errors.New(fmt.Sprintf("Calc fail,err1=%v,err2=%v", err1, err2))
	}

	if op == 1 {
		ad = ad.Add(bd)
	} else if op == -1 {
		ad = ad.Sub(bd)
	} else if op == 2 {
		ad = ad.Div(bd)
	} else if op == 3 {
		ad = ad.Mul(bd)
	}

	return fmt.Sprintf("%v", ad), nil
}

/**
a+b
*/
func Add(a string, b string) (r string, err error) {
	return Calc(a, b, 1, 20)
}

/**
a-b
*/
func Sub(a string, b string) (r string, err error) {
	return Calc(a, b, -1, 20)
}

/**
a/b
*/
func Div(a string, b string) (r string, err error) {
	return Calc(a, b, 2, 20)
}

/**
a*b
*/
func Mul(a string, b string) (r string, err error) {
	return Calc(a, b, 3, 20)
}

/**
s1 == s2
*/
func Equal(s1 string, s2 string) bool {
	a, err1 := decimal.NewFromString(s1)
	b, err2 := decimal.NewFromString(s2)

	if err1 != nil || err2 != nil {
		return false
	}
	return a.Equal(b)
}

/**
s1 < s2
*/
func LessThan(s1 string, s2 string) bool {
	a, err1 := decimal.NewFromString(s1)
	b, err2 := decimal.NewFromString(s2)

	if err1 != nil || err2 != nil {
		return false
	}
	return a.LessThan(b)
}

/**
s1 <= s2
*/
func LessThanOrEqual(s1 string, s2 string) bool {
	a, err1 := decimal.NewFromString(s1)
	b, err2 := decimal.NewFromString(s2)

	if err1 != nil || err2 != nil {
		return false
	}
	return a.LessThanOrEqual(b)
}

/**
s1 > s2
*/
func GreaterThan(s1 string, s2 string) bool {
	a, err1 := decimal.NewFromString(s1)
	b, err2 := decimal.NewFromString(s2)

	if err1 != nil || err2 != nil {
		return false
	}
	return a.GreaterThan(b)
}

/**
s1 >= s2
*/
func GreaterThanOrEqual(s1 string, s2 string) bool {
	a, err1 := decimal.NewFromString(s1)
	b, err2 := decimal.NewFromString(s2)

	if err1 != nil || err2 != nil {
		return false
	}
	return a.GreaterThanOrEqual(b)
}

其次需要有一个截取小数精度的方法

//小数精度截取
func PrecisionValue(value string, precision int) string {
	//判断字符中是否包含.
	if ok := strings.Contains(value, "."); ok {
		//以.截取字符串
		ss := strings.Split(value, ".")
		var a string
		//判断小数位是否大于精度,否则返回原值
		if len(ss[1]) > precision {
			a = ss[1][:precision]
			return (ss[0] + "." + a)
		}
	}
	return value
}

下面便是添加B或者M的单位

//数值单位换算
func UnitValue(strnum string, precision int) string {
	sdivision := strings.Split(strnum, ".")
	sl := sdivision[0]
	if len(sl) >= 10 {
		value, _ := libra.Div(sl, "1000000000")
		return PrecisionValue(value, precision) + "B"

	}
	if len(sl) >= 7 {
		value, _ := libra.Div(sl, "1000000")
		return PrecisionValue(value, precision) + "M"
	}
	return PrecisionValue(strnum, precision)
}

猜你喜欢

转载自blog.csdn.net/cljdsc/article/details/128413016
今日推荐