package main
import (
"fmt"
"math"
)
// 将数字转换为大写金额字符串
func num2Cn(num float64) string {
// 分别对应数字 0~9 的中文表述
cnNums := []string{"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}
// 分别对应数字 1~4 的中文表述,单位每 4 位递增
cnIntUnits := []string{"", "拾", "佰", "仟", "万", "拾万", "佰万", "仟万", "亿", "拾亿", "佰亿", "仟亿", "万亿"}
// 对应小数部分的中文表述
cnDecUnits := []string{"角", "分"}
// 获取小数部分的整数部分,保留 2 位小数
intPart := int64(math.Floor(num))
decPart := int64(math.Round((num - float64(intPart)) * 100))
// 转换整数部分为中文表述
var intPartCn string
if intPart == 0 {
intPartCn = cnNums[0]
} else {
var nZero int // 连续出现 0 的个数
var unitPos int // 当前数字的单位位置
for intPart > 0 {
digit := intPart % 10 // 取最低位数字
if digit == 0 {
// 当前位为 0,需要在当前位之前加上“零”
if nZero == 0 {
intPartCn = cnNums[digit] + intPartCn
}
nZero++
} else {
// 当前位不为 0,加上数字和单位
unit := cnIntUnits[unitPos]
intPartCn = cnNums[digit] + unit + intPartCn
nZero = 0
}
// 递增单位位置和整数部分
unitPos++
intPart /= 10
}
}
// 转换小数部分为中文表述
var decPartCn string
if decPart > 0 {
// 有小数部分,按照“角分”的顺序转换
decPartCn = cnNums[decPart/10] + cnDecUnits[0] + cnNums[decPart%10] + cnDecUnits[1]
}
// 拼接整数和小数部分的中文表述
result := intPartCn + decPartCn
if result == "" {
// 针对输入为 0 的情况
result = cnNums[0]
}
return result
}
func main() {
// 测试样例
fmt.Println(num2Cn(123456789.12)) // 壹亿贰仟叁佰肆拾伍万陆仟柒佰捌十玖元壹角
}
该代码将一个浮点数转换为大写金额字符串,支持处理万亿级别的数字,并将小数部分按照“角分”的顺序转换为中文表述。
页面更新:2024-05-20
本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828
© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号