golang工具函数,把一个金额整型,单位为分,转成"1,231,111.00"格式的字符串
这个函数首先将整数除以100来获取代表元的浮点数,然后格式化此数值为两位小数的字符串。接下来,函数将字符串分成整数和小数部分,并且为整数部分添加千位分隔符。最后,如果存在小数部分,它会将这两部分重新组合并返回正确格式化的金额字符串。
为了正确地处理负数,我们需要先检查金额是否为负,并在处理千位分隔符后重新加上负号。如果原始金额是否为负数,就将其转换成正数进行处理。在全部处理完成之后,如果原始金额是负数,我们将负号添加到最终的字符串结果前面,以确保负数的正确格式化显示。
package main
import (
"fmt"
"strings"
)
// formatCurrency 将分(包括正数和负数)转换为“1,231,111.00”或“-1,231,111.00”的格式
func formatCurrency(amount int64) string {
// 判断金额是否为负
isNegative := amount < 0
// 如果是负数,先转为正数处理
if isNegative {
amount = -amount
}
// 首先将金额转换为浮点数,并除以100得到元
yuan := float64(amount) / 100.0
// 使用Sprintf进行格式化,取两位小数
str := fmt.Sprintf("%.2f", yuan)
// 分割整数部分和小数部分
parts := strings.Split(str, ".")
// 处理整数部分的千位分隔符
intPart := parts[0]
if len(intPart) <= 3 {
// 对于长度不超过3的情况,直接处理负号
if isNegative {
return "-" + str
}
return str
}
var result []byte
count := 0
// 从后向前遍历整数部分,每隔3位加上逗号
for i := len(intPart) - 1; i >= 0; i-- {
count++
result = append([]byte{intPart[i]}, result...)
if count%3 == 0 && i != 0 {
result = append([]byte{','}, result...)
}
}
// 如果存在小数部分,将其添加到结果中
if len(parts) > 1 {
result = append(result, '.')
result = append(result, parts[1]...)
}
// 处理负号
if isNegative {
result = append([]byte{'-'}, result...)
}
return string(result)
}
func main() {
// 示例:1231111分和-1231111分
fmt.Println(formatCurrency(1231111)) // 输出 "12,311.11"
fmt.Println(formatCurrency(-1231111)) // 输出 "-12,311.11"
}