Welcome to Rooeye's blog

golang实现万亿级别以下阿拉伯数字转中文大写金额

golang rooeye 749℃ 0评论

之前练习了一个数字转英文表述,这次写一个转中文大写的,代码已经通过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()
	}
}

转载请注明: Jinkun 的博客 » golang实现万亿级别以下阿拉伯数字转中文大写金额

喜欢 (1)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址