這個函式首先將整數除以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"
}