golang实现万亿级别以下阿拉伯数字转中文大写金额
之前练习了一个数字转英文表述,这次写一个转中文大写的,代码已经通过OJ的测试 ,范围从 [0,999999999999]
package main
import (
"fmt"
)
var nums []rune = []rune{'零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖', '拾'}
var flag bool
//[0-9]
func ac10(a int) {
if !flag {
if a != 0 {
fmt.Printf("%c元", nums[a])
} else {
fmt.Print("元")
}
} else {
if a != 0 {
fmt.Printf("%c", nums[a])
}
}
}
//[10-99]
func ac99(a int) {
if a < 10 {
ac10(a)
return
}
s := a / 10
g := a % 10
if s != 1 {
fmt.Printf("%c拾", nums[s])
} else {
fmt.Print("拾")
}
ac10(g)
}
//[100-999]
func ac999(a int) {
if a < 100 {
ac99(a)
return
}
s := a / 100
g := a % 100
fmt.Printf("%c佰", nums[s])
if g < 10 && g != 0 {
fmt.Print("零")
}
ac99(g)
}
//[1000-9999]
func ac9999(a int) {
if a < 1000 {
ac999(a)
return
}
s := a / 1000
g := a % 1000
fmt.Printf("%c仟", nums[s])
if g < 100 && g != 0 {
fmt.Print("零")
}
ac999(g)
}
//[10000-99999999]
func ac99999999(a int) {
if a < 10000 {
ac9999(a)
return
}
s := a / 10000
g := a % 10000
flag = true
ac9999(s)
flag = false
fmt.Print("万")
if g < 1000 && g != 0 {
fmt.Print("零")
}
ac9999(g)
}
//[99999999-999999999999]
func ac999999999999(a int64) {
if a < 100000000 {
ac99999999(int(a))
return
}
s := int(a / 100000000)
g := int(a % 100000000)
flag = true
ac9999(s)
flag = false
fmt.Print("亿")
if g < 10000000 && g != 0 {
fmt.Print("零")
}
ac99999999(g)
}
func bC(t int) {
s := t / 10
g := t % 10
if s != 0 && g != 0 {
fmt.Printf("%c角%c分", nums[s], nums[g])
} else if s == 0 && g != 0 {
fmt.Printf("%c分", nums[g])
} else {
fmt.Printf("%c角", nums[s])
}
}
func toC(rmb float32) {
a := int64(rmb * 100)
b := int(a % 100)
a /= 100
if a != 0 && b != 0 {
ac999999999999(a)
bC(b)
} else if a == 0 && b != 0 {
bC(b)
} else if a != 0 && b == 0 {
ac999999999999(a)
fmt.Print("整")
} else {
fmt.Print("零元整")
}
}
func main() {
var rmb float32
for {
_, err := fmt.Scan(&rmb)
if err != nil {
return
}
fmt.Print("人民币")
toC(rmb)
fmt.Println()
}
}