format.go
1package utils
2
3import (
4 "golang.org/x/text/message"
5 "golang.org/x/text/number"
6)
7
8type Unit int
9
10const (
11 Imperial Unit = iota
12 Metric
13)
14
15type formatter struct {
16 lang string
17 units Unit
18}
19
20type FormatOption func(*formatter)
21
22func Language(lang string) FormatOption {
23 return func(f *formatter) {
24 f.lang = lang
25 }
26}
27
28func Units(units Unit) FormatOption {
29 return func(f *formatter) {
30 f.units = units
31 }
32}
33
34func FormatDistance(d float64, opts ...FormatOption) string {
35 f := &formatter{
36 lang: "en",
37 units: Imperial,
38 }
39 for _, opt := range opts {
40 opt(f)
41 }
42 p := message.NewPrinter(message.MatchLanguage(f.lang))
43 switch f.units {
44 case Imperial:
45 return p.Sprintf("%v mi", number.Decimal(d/1.609344, number.MaxFractionDigits(0)))
46 default:
47 return p.Sprintf("%v km", number.Decimal(d, number.MaxFractionDigits(0)))
48 }
49
50}