-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
words.go
83 lines (66 loc) · 1.82 KB
/
words.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
package words
import (
"math"
"strings"
)
var units [20]string = [20]string{"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"}
var tens [10]string = [10]string{"", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}
var powers [9]string = [9]string{"", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion"}
func collectParts(parts []string, n uint64, d uint64, s string) (uint64, []string) {
if n < d {
return n, parts
}
parts = collectPartsUnderAThousand(parts, n/d)
parts = append(parts, s)
return n % d, parts
}
func collectPartsUnderAThousand(parts []string, n uint64) []string {
if n >= 100 {
parts = append(parts, units[n/100])
parts = append(parts, "hundred")
n = n % 100
}
if n >= 20 {
parts = append(parts, tens[n/10])
n = n % 10
}
if n > 0 {
parts = append(parts, units[n])
}
return parts
}
func FromUint8(n uint8) string {
return FromInt64(int64(n))
}
func FromInt8(n int8) string {
return FromInt64(int64(n))
}
func FromInt16(n int16) string {
return FromInt64(int64(n))
}
func FromUint16(n uint16) string {
return FromInt64(int64(n))
}
func FromInt32(n int32) string {
return FromInt64(int64(n))
}
func FromUint32(n uint32) string {
return FromInt64(int64(n))
}
func FromInt64(n int64) string {
if n < 0 {
return "minus " + FromUint64(uint64(-n))
}
return FromUint64(uint64(n))
}
func FromUint64(n uint64) string {
if n == 0 {
return "zero"
}
var parts []string = make([]string, 0, 32)
for i := 6; i > 0; i-- {
n, parts = collectParts(parts, n, uint64(math.Pow10(i*3)), powers[i])
}
parts = collectPartsUnderAThousand(parts, n)
return strings.Join(parts, " ")
}