首页 > 其他分享 >golang工具函数,把一个金额整型,单位为分,转成"1,231,111.00"格式的字符串

golang工具函数,把一个金额整型,单位为分,转成"1,231,111.00"格式的字符串

时间:2024-04-24 23:55:08浏览次数:25  
标签:为分 负数 golang amount result 字符串 231 append 小数

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

标签:为分,负数,golang,amount,result,字符串,231,append,小数
From: https://www.cnblogs.com/hi3254014978/p/18156639

相关文章

  • Golang - 并发同步更新全局切片失败的原因以及解决方案
    当多个协程同时访问和修改同一个共享资源(如切片)时,如果没有适当的同步机制,可能会导致数据竞争和不一致的结果。packagemainimport("fmt""sync")funcprocessChunk(chunk[]int64,wg*sync.WaitGroup,failedList[]int64){deferwg.Done()fmt.Print......
  • golang 实现文件下载
    golang实现文件下载packagemainimport("fmt""html/template""io""io/fs""mime""net/http""os""path/filepath""regexp"&qu......
  • golang通过sock进行通信
    只是demo,生产环境要防止粘包。可以作为多进程之间通讯。。。。serverpackagemainimport( "fmt" "net" "os" "os/signal" "sync" "syscall")//客户端连接结构typeClientstruct{ Conn*net.UnixConn}varclients=make(map......
  • 20231325 贾罗祁 实验三《Python程序设计》实验报告
    20231325贾罗祁2023-2024-2《Python程序设计》实验三报告课程:《Python程序设计》班级:2313姓名:贾罗祁学号:20231325实验教师:王志强实验日期:2024年4月17日必修/选修:公选课1.实验内容创建服务端和客户端,服务端在特定端口监听多个客户请求。客户端和服务端通过Socket套......
  • 秒杀removeDuplicates问题(Golang版本)
    周末食欲不振,拿一道简单难度的题找找感觉,题目如下:Givenanintegerarraynumssortedinnon-decreasingorder,removetheduplicatesin-placesuchthateachuniqueelementappearsonlyonce.Therelativeorderoftheelementsshouldbekeptthesame.Thenreturn......
  • Golang一日一库之gjson
    官网https://github.com/tidwall/gjson一简介gjson实际上是get+json的缩写,用于读取JSON串二使用1.安装gogetgithub.com/tidwall/gjson2.使用packagemainimport("fmt""github.com/tidwall/gjson")funcmain(){json:=`{"name":{......
  • GESP 202312 游记
    day0把一本通上的指针扫了一遍,睡觉!day19:00入场,在第二个考场。冲进昌平二中,码了Hello,World!。9:30发网址,开题监考老师居然说阅读程序题可以打代码!······选择题指针真多啊!选择+判断半小时写完,还挺快的!程序题第一题:把一个字符串的其中的一些单词换成另一些单词码......
  • 转载Using Domain-Driven Design(DDD)in Golang
    转载自:https://dev.to/stevensunflash/using-domain-driven-design-ddd-in-golang-3ee5UsingDomain-DrivenDesign(DDD)inGolang#go#ddd#redis#postgresDomain-DrivenDesignpatternisthetalkofthetowntoday.Domain-DrivenDesign(DDD)isanapproachtosoft......
  • 用户行为分析模型实践(四)—— 留存分析模型
    作者:vivo互联网大数据团队-WuYonggang、LiXiong本文是vivo互联网大数据团队《用户行为分析模型实践》系列文章第4篇-留存分析模型。本文详细介绍了留存分析模型的概念及基本原理,并阐述了其在产品中具体实现。针对在实际使用过程问题,探索了基于ClickHouse留存分析模型实践......
  • golang etcd键值存储系统
    目录存储配置文件watch命令在Go语言中,etcd是一个高可用的键值存储系统,它主要用于共享配置和服务发现。etcd由CoreOS团队开发,它是Kubernetes项目中用于存储所有集群数据的关键组件。etcd使用Raft协议来保持集群之间的数据一致性,并且提供了强一致性保证https://blog.csdn.net/jo......