一个将数字转换为大写金额的 Go 代码(GO语言)

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

标签:金额   数字   小数   整数   字符串   中文   顺序   个数   位置   语言   单位   代码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top