-
Notifications
You must be signed in to change notification settings - Fork 0
/
approximate.go
58 lines (50 loc) · 1.26 KB
/
approximate.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
package approximate
import (
"math"
"strconv"
"strings"
)
var defaultUnits = map[string]string{
"thousand": "K",
"million": "M",
"billion": "G",
}
func round(x float64, prec int) float64 {
var rounder float64
pow := math.Pow(10, float64(prec))
intermed := x * pow
if intermed < 0.0 {
intermed -= 0.5
} else {
intermed += 0.5
}
rounder = float64(int64(intermed))
return rounder / float64(pow)
}
func Approximate(number int) string {
return ApproximateWithUnits(number, defaultUnits["thousand"], defaultUnits["million"], defaultUnits["billion"])
}
func ApproximateWithUnits(number int, thousand, million, billion string) string {
divisor := 1.0
unit := ""
numberFloat := float64(number)
absNumber := math.Abs(numberFloat)
if absNumber >= 999950000 { // billions
divisor = 1e9
unit = billion
} else if absNumber >= 999950 { // millions
divisor = 1e6
unit = million
} else if absNumber >= 1000 { // thousands
divisor = 1e3
unit = thousand
}
division := numberFloat / divisor
precision := 0
if math.Abs(division) < 10 && division-round(division, 0) != 0 {
precision = 1
}
numberString := strconv.FormatFloat(round(division, precision), 'f', -1, 64)
numberString = strings.Replace(numberString, "1000", "999", -1) + unit
return numberString
}