79 lines
1.5 KiB
Go
79 lines
1.5 KiB
Go
package platform
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
func FormatCZK(amountMinor int64) string {
|
|
sign := ""
|
|
if amountMinor < 0 {
|
|
sign = "-"
|
|
amountMinor = -amountMinor
|
|
}
|
|
|
|
whole := amountMinor / 100
|
|
fraction := amountMinor % 100
|
|
|
|
return fmt.Sprintf("%s%s,%02d CZK", sign, formatThousands(whole), fraction)
|
|
}
|
|
|
|
func ParseCZK(input string) (int64, error) {
|
|
clean := strings.TrimSpace(strings.ReplaceAll(input, " ", ""))
|
|
clean = strings.ReplaceAll(clean, ",", ".")
|
|
if clean == "" {
|
|
return 0, fmt.Errorf("amount is required")
|
|
}
|
|
|
|
parts := strings.Split(clean, ".")
|
|
if len(parts) > 2 {
|
|
return 0, fmt.Errorf("invalid amount")
|
|
}
|
|
|
|
whole, err := strconv.ParseInt(parts[0], 10, 64)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("invalid whole amount")
|
|
}
|
|
|
|
var fraction int64
|
|
if len(parts) == 2 {
|
|
frac := parts[1]
|
|
if len(frac) > 2 {
|
|
return 0, fmt.Errorf("too many decimal places")
|
|
}
|
|
if len(frac) == 1 {
|
|
frac += "0"
|
|
}
|
|
if len(frac) == 0 {
|
|
frac = "00"
|
|
}
|
|
|
|
fraction, err = strconv.ParseInt(frac, 10, 64)
|
|
if err != nil {
|
|
return 0, fmt.Errorf("invalid decimal amount")
|
|
}
|
|
}
|
|
|
|
if whole < 0 || fraction < 0 {
|
|
return 0, fmt.Errorf("amount must be positive")
|
|
}
|
|
|
|
return whole*100 + fraction, nil
|
|
}
|
|
|
|
func formatThousands(value int64) string {
|
|
plain := strconv.FormatInt(value, 10)
|
|
if len(plain) <= 3 {
|
|
return plain
|
|
}
|
|
|
|
var parts []string
|
|
for len(plain) > 3 {
|
|
parts = append([]string{plain[len(plain)-3:]}, parts...)
|
|
plain = plain[:len(plain)-3]
|
|
}
|
|
parts = append([]string{plain}, parts...)
|
|
|
|
return strings.Join(parts, " ")
|
|
}
|