这个函数首先将整数除以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"
}