| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 | package coinimport (	"bytes"	"fmt"	"strconv"	"github.com/shopspring/decimal")// 货币类型type CoinType int8const (	COIN_TYPE_INT  CoinType = 1 //整形货币	COIN_TYPE_TWO  CoinType = 2 //两位小数货币	COIN_TYPE_FOUR CoinType = 4 //4位小数	COIN_TYPE_SIX  CoinType = 6 //6位小数)// 平台货币类型var coinType CoinType// 设置货币类型func SetCoinType(t CoinType) {	if coinType != 0 {		panic("不可重复设置货币类型")	}	coinType = t}// 获取货币类型func GetCoinType() CoinType {	return coinType}// 获取设置的小数比例func GetRate() int64 {	switch coinType {	case COIN_TYPE_TWO: //输出两位小数		return 100	case COIN_TYPE_FOUR:		return 10000	case COIN_TYPE_SIX:		return 1000000	default: //输出整形		return 1	}}// 根据货币类型返回相应的数除比例func GetRateByCoinType(t CoinType) int64 {	switch t {	case COIN_TYPE_TWO: //输出两位小数		return 100	case COIN_TYPE_FOUR:		return 10000	case COIN_TYPE_SIX:		return 1000000	default: //输出整形		return 1	}}// 根据默认配置获取货币,浮点型转整形func GetCoin(d float64) Coin {	switch coinType {	case COIN_TYPE_TWO: //输出两位小数		return Coin(d * 100)	case COIN_TYPE_FOUR:		return Coin(d * 10000)	case COIN_TYPE_SIX:		return Coin(d * 1000000)	default: //输出整形		return Coin(d)	}}// 平台货币type Coin int64func (self Coin) String() string {	switch coinType {	case COIN_TYPE_TWO: //输出两位小数		return fmt.Sprintf(`%.2f`, float64(self)/100)	case COIN_TYPE_FOUR:		return fmt.Sprintf(`%.4f`, float64(self)/10000)	case COIN_TYPE_SIX:		return fmt.Sprintf(`%.6f`, float64(self)/1000000)	default: //输出整形		return fmt.Sprintf(`%d`, self)	}}// 反序列化func (self *Coin) UnmarshalJSON(data []byte) error {	data = bytes.Replace(data, []byte(`"`), []byte(""), -1) //避免出现字符串类型数据	switch coinType {	case COIN_TYPE_TWO: //输出两位小数		number, err := strconv.ParseFloat(string(data), 64)		if err != nil {			return err		}		*self = Coin(decimal.NewFromFloat(number).Mul(decimal.NewFromFloat(100)).IntPart())	case COIN_TYPE_FOUR: //输出4位小数		number, err := strconv.ParseFloat(string(data), 64)		if err != nil {			return err		}		*self = Coin(decimal.NewFromFloat(number).Mul(decimal.NewFromFloat(10000)).IntPart())	case COIN_TYPE_SIX: //输出6位小数		number, err := strconv.ParseFloat(string(data), 64)		if err != nil {			return err		}		*self = Coin(decimal.NewFromFloat(number).Mul(decimal.NewFromFloat(1000000)).IntPart())	default: //输出整形		number, err := strconv.ParseInt(string(data), 10, 64)		if err != nil {			return err		}		*self = Coin(number)	}	return nil}func (self Coin) MarshalJSON() ([]byte, error) {	return []byte(self.String()), nil}// 数据格式验证func (self Coin) Validate() error {	return nil}func (self Coin) Int64() int64 {	return int64(self)}
 |