104 lines
3.0 KiB
Go
104 lines
3.0 KiB
Go
package han
|
|
|
|
import (
|
|
"amuz.es/src/go/misc/strutil"
|
|
"strings"
|
|
)
|
|
|
|
const (
|
|
koreanPluralizeSubunit = 10
|
|
koreanPluralizeUnit = 10000
|
|
zeroChr = '0'
|
|
)
|
|
|
|
var (
|
|
koreanPluralizeUnitLabels = []string{"", "만", "억", "조"}
|
|
koreanPluralizeSubunitLabels = []string{"", "십", "백", "천"}
|
|
)
|
|
|
|
func transKoreanPluralizeSubunit(number int) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
buf strings.Builder
|
|
digit int
|
|
)
|
|
for radix := 0; number > 0; radix++ {
|
|
digit, number = number%koreanPluralizeSubunit, number/koreanPluralizeSubunit
|
|
if digit > 0 {
|
|
buf.WriteString(koreanPluralizeSubunitLabels[radix%len(koreanPluralizeSubunitLabels)])
|
|
}
|
|
if digit > 1 || (digit == 1 && radix == 0) {
|
|
buf.WriteByte(zeroChr + byte(digit))
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
func transKoreanPluralizeUnit(number int, subunitmapper func(int) string, omitLastOne bool) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
buf strings.Builder
|
|
digit, lastDigit int
|
|
)
|
|
for radix := 0; number > 0; radix++ {
|
|
digit = number % koreanPluralizeUnit
|
|
number = number / koreanPluralizeUnit
|
|
lastDigit = digit % koreanPluralizeSubunit
|
|
if digit > 0 {
|
|
buf.WriteString(koreanPluralizeUnitLabels[radix%len(koreanPluralizeUnitLabels)])
|
|
}
|
|
// 1 뭉개기
|
|
if omitLastOne && radix > 0 && lastDigit == 1 {
|
|
digit--
|
|
}
|
|
//나머지 처리
|
|
if digit > 1 || (digit == 1 && (radix == 0 || !omitLastOne)) {
|
|
buf.WriteString(subunitmapper(digit))
|
|
}
|
|
}
|
|
return buf.String()
|
|
}
|
|
|
|
// KoreanPluralizeSubunit is a function for translating into Korean after omitting the most significant digit when the most significant digit is 1.
|
|
func KoreanPluralizeSubunit(number int) (out string) {
|
|
out = strutil.Reverse(transKoreanPluralizeSubunit(number))
|
|
return
|
|
}
|
|
|
|
// KoreanPluralizeUnit is a function for translating into Korean after omitting the most significant digit when the most significant digit is 1.
|
|
func KoreanPluralizeUnit(number int) (out string) {
|
|
out = strutil.Reverse(transKoreanPluralizeUnit(number, transKoreanPluralizeSubunit, true))
|
|
return
|
|
}
|
|
|
|
// KoreanPluralizeUnitType2 function is a function that translates only each 10,000 units into Korean.
|
|
func KoreanPluralizeUnitType2(number int) (out string) {
|
|
out = strutil.Reverse(transKoreanPluralizeUnit(number, strutil.FormatIntToStringReversed, false))
|
|
return
|
|
}
|
|
|
|
//KoreanPluralizeUnitType3 is a function for translating into Korean.
|
|
func KoreanPluralizeUnitType3(number int) (out string) {
|
|
if number == 0 {
|
|
return "0"
|
|
}
|
|
var (
|
|
below10thousand = number % koreanPluralizeUnit
|
|
above10thousand = (number / koreanPluralizeUnit) * koreanPluralizeUnit
|
|
outBelow10thousand, outAbove10thousand string
|
|
)
|
|
|
|
if below10thousand > 0 {
|
|
outBelow10thousand = strutil.FormatIntToStringReversed(below10thousand)
|
|
}
|
|
if above10thousand > 0 {
|
|
outAbove10thousand = transKoreanPluralizeUnit(above10thousand, transKoreanPluralizeSubunit, false)
|
|
}
|
|
out = strutil.Reverse(outBelow10thousand + outAbove10thousand)
|
|
return
|
|
}
|