Skip to content

Commit

Permalink
add CAtoi fucntion
Browse files Browse the repository at this point in the history
  • Loading branch information
jhunters committed Apr 22, 2024
1 parent 07ad516 commit 81c034e
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 2 deletions.
92 changes: 90 additions & 2 deletions conv/conv.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,20 @@ const (
CH_ONE = '一'
RUNE_ONE = 1
RUNE_ZERO = 0

S_ZERO = '0'

CH_WAN_BIT = 4 // 4 bit for '万'
CH_YI_BIT = 8 // 8 bit for '亿'
)

var (
Chinese_Uint_Number map[rune]int
Chinese_Number map[rune]byte

Number_Chinese_Uint map[int]rune
Number_Chinese map[rune]rune

Chinese_Unit []rune
)

Expand All @@ -54,8 +62,15 @@ func init() {
Chinese_Uint_Number['百'] = 2
Chinese_Uint_Number[CH_TEN] = 1

Number_Chinese_Uint = map[int]rune{}
Number_Chinese_Uint[9] = '亿'
Number_Chinese_Uint[5] = '万'
Number_Chinese_Uint[3] = '千'
Number_Chinese_Uint[2] = '百'
Number_Chinese_Uint[1] = CH_TEN

Chinese_Number = map[rune]byte{}
Chinese_Number['一'] = RUNE_ONE
Chinese_Number[CH_ONE] = RUNE_ONE
Chinese_Number['二'] = 2
Chinese_Number['三'] = 3
Chinese_Number['四'] = 4
Expand All @@ -66,9 +81,82 @@ func init() {
Chinese_Number['八'] = 8
Chinese_Number['九'] = 9
Chinese_Number[CH_ZERO] = RUNE_ZERO

Number_Chinese = map[rune]rune{}
Number_Chinese['1'] = CH_ONE
Number_Chinese['2'] = '二'
Number_Chinese['3'] = '三'
Number_Chinese['4'] = '四'
Number_Chinese['5'] = '五'
Number_Chinese['6'] = '六'
Number_Chinese['7'] = '七'
Number_Chinese['8'] = '八'
Number_Chinese['9'] = '九'
Number_Chinese['0'] = CH_ZERO

}

// CAtoi 函数将传入的数字 uint 转换为中文大写表示,并返回转换后的字符串和 error。
// 如果 num 为 0,则直接返回 "零" 和 nil。
func CAtoi(num uint) (string, error) {
if num == 0 {
return string(CH_ZERO), nil
}
numStr := fmt.Sprintf("%d", num)
nums := []rune(numStr)

ret := ""
cbit := 0
cunitbit := 0

isZero := false
isFirstNoneZero := false
for i := len(nums) - 1; i >= 0; i-- {
n := nums[i]

if n == S_ZERO {
isZero = true
if cbit == CH_WAN_BIT { // 进万 (或亿)
ret = string(Number_Chinese_Uint[(cunitbit%2+1)*4+1]) + ret
isFirstNoneZero = false
}
} else {
if isFirstNoneZero && isZero {
if cbit == 0 {
ret = string(CH_TEN) + ret
} else {
ret = string(CH_ZERO) + ret
}
}

isZero = false
isFirstNoneZero = true

if v, ok := Number_Chinese_Uint[cbit]; ok && !isZero {
ret = string(v) + ret
}

if cbit == CH_WAN_BIT { // 进万 (或亿)
ret = string(Number_Chinese_Uint[(cunitbit%2+1)*4+1]) + ret
}
ret = string(Number_Chinese[n]) + ret
}
if cbit == CH_WAN_BIT { // 进万 (或亿)
cbit = 0
cunitbit++
}

cbit++
}

return ret, nil
}

// CItoa convert chinese number to asc number string
// CItoa 函数将中文数字转换为阿拉伯数字,并返回结果和可能存在的错误。
// 参数chinesenum:需要转换的中文数字。
// 返回值string:转换后的阿拉伯数字。
// 返回值error:转换过程中可能遇到的错误。
func CItoa(chinesenum string) (string, error) {
if stringutil.IsBlank(chinesenum) {
return stringutil.EMPTY_STRING, fmt.Errorf("invalid chinese number. %s", chinesenum)
Expand All @@ -91,7 +179,7 @@ func CItoa(chinesenum string) (string, error) {
if biggestUnit < v {
biggestUnit = v
fixedunit = v // just ajust to fixed unit
} else {
} else { // 未超过最大单位
// if just like '万、亿' add num unit
fixedunit += v
}
Expand Down
30 changes: 30 additions & 0 deletions conv/conv_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -568,6 +568,36 @@ func TestCitoa(t *testing.T) {

}

func TestCAtoi(t *testing.T) {
Convey("TestCAtoi", t, func() {
numStr, err := conv.CAtoi(0)
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "零")
numStr, err = conv.CAtoi(10)
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "一十")
numStr, err = conv.CAtoi(20010)
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "二万零一十")

numStr, err = conv.CAtoi(10000)
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "一万")

numStr, err = conv.CAtoi(501020010)
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "五亿零一百零二万零一十")

numStr, err = conv.CAtoi(1501020010)
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "一十五亿零一百零二万零一十")

numStr, err = conv.CAtoi(908070605040302010) // 90 8070 6050 4030 2010
So(err, ShouldBeNil)
So(numStr, ShouldEqual, "九十亿八千零七十万六千零五十亿四千零三十万二千零一十")
})
}

func ExampleCItoa() {
numStr, err := conv.CItoa("一千万零一百一十五")
if err == nil {
Expand Down

0 comments on commit 81c034e

Please sign in to comment.