币圈数值转换

我们经常可以在币安中看到,某交易对的成交量或者成交额都有一个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)
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杰哥的技术杂货铺

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值