Files
junhong_cmp_fiber/pkg/alipay/amount.go

89 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// Package alipay 支付宝支付能力封装
// 提供 client 构建、金额转换、WAP 支付链接生成、回调验签等辅助函数
package alipay
import (
"fmt"
"strings"
)
// FenToYuan 将分(整数)转换为元字符串,精确到小数点后两位。
// 例如123 -> "1.23"100 -> "1.00"1 -> "0.01"
func FenToYuan(amountFen int64) string {
// 整除得元,取余得分
yuan := amountFen / 100
fen := amountFen % 100
if fen < 0 {
fen = -fen
}
return fmt.Sprintf("%d.%02d", yuan, fen)
}
// YuanToFen 将元字符串转换为分(整数)。
// 只接受合法金额格式:最多两位小数,纯数字加可选小数点,拒绝科学计数法和负数。
// 例如:"1.23" -> 123"1.00" -> 100"1" -> 100
func YuanToFen(value string) (int64, error) {
value = strings.TrimSpace(value)
if value == "" {
return 0, fmt.Errorf("金额字符串不能为空")
}
// 禁止负数
if strings.HasPrefix(value, "-") {
return 0, fmt.Errorf("金额不能为负数: %s", value)
}
// 禁止科学计数法
if strings.ContainsAny(value, "eE") {
return 0, fmt.Errorf("金额格式非法,禁止科学计数法: %s", value)
}
parts := strings.Split(value, ".")
if len(parts) > 2 {
return 0, fmt.Errorf("金额格式非法: %s", value)
}
// 校验整数部分
yuanStr := parts[0]
if !isDigits(yuanStr) {
return 0, fmt.Errorf("金额格式非法: %s", value)
}
// 解析整数部分
var yuan int64
for _, c := range yuanStr {
yuan = yuan*10 + int64(c-'0')
}
var fen int64
if len(parts) == 2 {
fenStr := parts[1]
if len(fenStr) == 0 || len(fenStr) > 2 {
return 0, fmt.Errorf("金额小数位数非法(最多两位): %s", value)
}
if !isDigits(fenStr) {
return 0, fmt.Errorf("金额格式非法: %s", value)
}
// 补齐到两位
if len(fenStr) == 1 {
fenStr += "0"
}
for _, c := range fenStr {
fen = fen*10 + int64(c-'0')
}
}
return yuan*100 + fen, nil
}
// isDigits 判断字符串是否全为数字字符
func isDigits(s string) bool {
if s == "" {
return false
}
for _, c := range s {
if c < '0' || c > '9' {
return false
}
}
return true
}