golang工具函式,把一個金額整型,單位為分,轉成"1,231,111.00"格式的字串

Lucky小黄人^_^發表於2024-04-24

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

相關文章