@@ -0,0 +1,36 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
"git.sundynix.cn/Blizzard/Veyra/internal/apperror"
|
||||
)
|
||||
|
||||
var moneyPattern = regexp.MustCompile(`^(0|[1-9][0-9]{0,9})(\.[0-9]{1,2})?$`)
|
||||
|
||||
// ParseMoney converts decimal text into exact cents, rejecting rounding and exponents.
|
||||
func ParseMoney(value string) (int64, error) {
|
||||
if !moneyPattern.MatchString(value) {
|
||||
return 0, apperror.ErrInvalidInput
|
||||
}
|
||||
whole, fraction, _ := strings.Cut(value, ".")
|
||||
units, err := strconv.ParseInt(whole, 10, 64)
|
||||
if err != nil {
|
||||
return 0, apperror.ErrInvalidInput
|
||||
}
|
||||
fraction += strings.Repeat("0", 2-len(fraction))
|
||||
cents, err := strconv.ParseInt(fraction, 10, 64)
|
||||
if err != nil {
|
||||
return 0, apperror.ErrInvalidInput
|
||||
}
|
||||
amount := units*100 + cents
|
||||
if amount > 100000000000 {
|
||||
return 0, apperror.ErrInvalidInput
|
||||
}
|
||||
return amount, nil
|
||||
}
|
||||
|
||||
func FormatMoney(minor int64) string { return fmt.Sprintf("%d.%02d", minor/100, minor%100) }
|
||||
Reference in New Issue
Block a user