digits-2023-10-15/digits-work-sample-go.d/amount.go

59 lines
1.4 KiB
Go

package analyzer
import (
"math"
"os"
"regexp"
"strings"
"golang.org/x/text/currency"
"golang.org/x/text/language"
"golang.org/x/text/message"
)
type Amount float64
var localizedLanguagePrinter = func() *message.Printer {
_newLocalizedLanguage := func() (language.Tag, bool) {
environmentLang := os.Getenv("LANG")
if environmentLang == "" {
return language.Tag{}, false
}
regexp := regexp.MustCompile(`^([a-z]+)_([A-Z]+)\.[A-Z0-9-]+$`)
results := regexp.FindAllStringSubmatch(environmentLang, -1)
if len(results) != 1 || len(results[0]) != 3 {
return language.Tag{}, false
}
base, err := language.ParseBase(results[0][1])
if err != nil {
return language.Tag{}, false
}
region, err := language.ParseRegion(results[0][2])
if err != nil {
return language.Tag{}, false
}
result, err := language.Compose(base, region)
return result, err == nil
}
result, ok := _newLocalizedLanguage()
if !ok {
return message.NewPrinter(language.AmericanEnglish)
}
return message.NewPrinter(result)
}()
// Rounded rounds a float to the number of places specified.
func (amount Amount) Rounded(places int) Amount {
p := math.Pow10(places)
return Amount(math.Round(float64(amount)*p) / p)
}
// FormatUSD formats Amount as a string in US dollars.
func (amount Amount) FormatUSD() string {
// TODO: Not implemented.
// Hint: Number localization gets tricky. Can you find a library to help?
return ""
}