golang 人民币数字转人民币大写

108 阅读1分钟

#金石焕新程#

好久没来掘金写文章了,今天突然想起里,来写一点点,哈哈 继续开发,继续go~~~


直接上代码:拿走不谢


import (
	"errors"
	"fmt"
	"regexp"
	"strconv"
	"strings"
)

func main() {
// 300000189的单位是分,实际金额: 3000001.89
	fmt.Println(Convert(300000189))
}

var (
	sliceUnit = []string{"仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", "元", "角", "分"}

	upperDigitUnit = map[string]string{
		"0": "零",
		"1": "壹",
		"2": "贰",
		"3": "叁",
		"4": "肆",
		"5": "伍",
		"6": "陆",
		"7": "柒",
		"8": "捌",
		"9": "玖",
	}
)

func Convert(money int) (string, error) {
	strMoney := strconv.Itoa(money)

	if len(strMoney) > len(sliceUnit) {
		return "", errors.New("太大了")
	}

	units := sliceUnit[len(sliceUnit)-len(strMoney):]
	amounts := make([]string, len(units))
	for idx, num := range strMoney {
		amounts[idx] = fmt.Sprintf("%s%s", upperDigitUnit[string(num)], units[idx])
	}

	str := strings.Join(amounts, "")
	reg, _ := regexp.Compile(`零角零分$`)
	str = reg.ReplaceAllString(str, "整")

	reg, _ = regexp.Compile(`零角`)
	str = reg.ReplaceAllString(str, "零")

	reg, _ = regexp.Compile(`零分$`)
	str = reg.ReplaceAllString(str, "整")

	reg, _ = regexp.Compile(`零[仟佰拾]`)
	str = reg.ReplaceAllString(str, "零")

	reg, _ = regexp.Compile(`零{2,}`)
	str = reg.ReplaceAllString(str, "零")

	reg, _ = regexp.Compile(`零亿`)
	str = reg.ReplaceAllString(str, "亿")

	reg, _ = regexp.Compile(`零万`)
	str = reg.ReplaceAllString(str, "万")

	reg, _ = regexp.Compile(`零*元`)
	str = reg.ReplaceAllString(str, "元")

	reg, _ = regexp.Compile(`亿零{0, 3}万`)
	str = reg.ReplaceAllString(str, "^元")

	reg, _ = regexp.Compile(`零元`)
	str = reg.ReplaceAllString(str, "零")

	return str, nil
}