BT  ·  2026-05-28

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}