coin.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package coin
  2. import (
  3. "bytes"
  4. "fmt"
  5. "strconv"
  6. "github.com/shopspring/decimal"
  7. )
  8. // 货币类型
  9. type CoinType int8
  10. const (
  11. COIN_TYPE_INT CoinType = 1 //整形货币
  12. COIN_TYPE_TWO CoinType = 2 //两位小数货币
  13. COIN_TYPE_FOUR CoinType = 4 //4位小数
  14. COIN_TYPE_SIX CoinType = 6 //6位小数
  15. )
  16. // 平台货币类型
  17. var coinType CoinType
  18. // 设置货币类型
  19. func SetCoinType(t CoinType) {
  20. if coinType != 0 {
  21. panic("不可重复设置货币类型")
  22. }
  23. coinType = t
  24. }
  25. // 获取货币类型
  26. func GetCoinType() CoinType {
  27. return coinType
  28. }
  29. // 获取设置的小数比例
  30. func GetRate() int64 {
  31. switch coinType {
  32. case COIN_TYPE_TWO: //输出两位小数
  33. return 100
  34. case COIN_TYPE_FOUR:
  35. return 10000
  36. case COIN_TYPE_SIX:
  37. return 1000000
  38. default: //输出整形
  39. return 1
  40. }
  41. }
  42. // 根据货币类型返回相应的数除比例
  43. func GetRateByCoinType(t CoinType) int64 {
  44. switch t {
  45. case COIN_TYPE_TWO: //输出两位小数
  46. return 100
  47. case COIN_TYPE_FOUR:
  48. return 10000
  49. case COIN_TYPE_SIX:
  50. return 1000000
  51. default: //输出整形
  52. return 1
  53. }
  54. }
  55. // 根据默认配置获取货币,浮点型转整形
  56. func GetCoin(d float64) Coin {
  57. switch coinType {
  58. case COIN_TYPE_TWO: //输出两位小数
  59. return Coin(d * 100)
  60. case COIN_TYPE_FOUR:
  61. return Coin(d * 10000)
  62. case COIN_TYPE_SIX:
  63. return Coin(d * 1000000)
  64. default: //输出整形
  65. return Coin(d)
  66. }
  67. }
  68. // 平台货币
  69. type Coin int64
  70. func (self Coin) String() string {
  71. switch coinType {
  72. case COIN_TYPE_TWO: //输出两位小数
  73. return fmt.Sprintf(`%.2f`, float64(self)/100)
  74. case COIN_TYPE_FOUR:
  75. return fmt.Sprintf(`%.4f`, float64(self)/10000)
  76. case COIN_TYPE_SIX:
  77. return fmt.Sprintf(`%.6f`, float64(self)/1000000)
  78. default: //输出整形
  79. return fmt.Sprintf(`%d`, self)
  80. }
  81. }
  82. // 反序列化
  83. func (self *Coin) UnmarshalJSON(data []byte) error {
  84. data = bytes.Replace(data, []byte(`"`), []byte(""), -1) //避免出现字符串类型数据
  85. switch coinType {
  86. case COIN_TYPE_TWO: //输出两位小数
  87. number, err := strconv.ParseFloat(string(data), 64)
  88. if err != nil {
  89. return err
  90. }
  91. *self = Coin(decimal.NewFromFloat(number).Mul(decimal.NewFromFloat(100)).IntPart())
  92. case COIN_TYPE_FOUR: //输出4位小数
  93. number, err := strconv.ParseFloat(string(data), 64)
  94. if err != nil {
  95. return err
  96. }
  97. *self = Coin(decimal.NewFromFloat(number).Mul(decimal.NewFromFloat(10000)).IntPart())
  98. case COIN_TYPE_SIX: //输出6位小数
  99. number, err := strconv.ParseFloat(string(data), 64)
  100. if err != nil {
  101. return err
  102. }
  103. *self = Coin(decimal.NewFromFloat(number).Mul(decimal.NewFromFloat(1000000)).IntPart())
  104. default: //输出整形
  105. number, err := strconv.ParseInt(string(data), 10, 64)
  106. if err != nil {
  107. return err
  108. }
  109. *self = Coin(number)
  110. }
  111. return nil
  112. }
  113. func (self Coin) MarshalJSON() ([]byte, error) {
  114. return []byte(self.String()), nil
  115. }
  116. // 数据格式验证
  117. func (self Coin) Validate() error {
  118. return nil
  119. }
  120. func (self Coin) Int64() int64 {
  121. return int64(self)
  122. }