77 lines
2.5 KiB
Go
77 lines
2.5 KiB
Go
// Copyright 2017 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package number
|
|
|
|
// TODO:
|
|
// p.Printf("The gauge was at %v.", number.Spell(number.Percent(23)))
|
|
// // Prints: The gauge was at twenty-three percent.
|
|
//
|
|
// p.Printf("From here to %v!", number.Spell(math.Inf()))
|
|
// // Prints: From here to infinity!
|
|
//
|
|
|
|
import (
|
|
"golang.org/x/text/internal/number"
|
|
)
|
|
|
|
const (
|
|
decimalVerbs = "vfgd"
|
|
scientificVerbs = "veg"
|
|
)
|
|
|
|
// Decimal formats a number as a floating point decimal.
|
|
func Decimal(x interface{}, opts ...Option) Formatter {
|
|
return newFormatter(decimalOptions, opts, x)
|
|
}
|
|
|
|
var decimalOptions = newOptions(decimalVerbs, (*number.Formatter).InitDecimal)
|
|
|
|
// Scientific formats a number in scientific format.
|
|
func Scientific(x interface{}, opts ...Option) Formatter {
|
|
return newFormatter(scientificOptions, opts, x)
|
|
}
|
|
|
|
var scientificOptions = newOptions(scientificVerbs, (*number.Formatter).InitScientific)
|
|
|
|
// Engineering formats a number using engineering notation, which is like
|
|
// scientific notation, but with the exponent normalized to multiples of 3.
|
|
func Engineering(x interface{}, opts ...Option) Formatter {
|
|
return newFormatter(engineeringOptions, opts, x)
|
|
}
|
|
|
|
var engineeringOptions = newOptions(scientificVerbs, (*number.Formatter).InitEngineering)
|
|
|
|
// Percent formats a number as a percentage. A value of 1.0 means 100%.
|
|
func Percent(x interface{}, opts ...Option) Formatter {
|
|
return newFormatter(percentOptions, opts, x)
|
|
}
|
|
|
|
var percentOptions = newOptions(decimalVerbs, (*number.Formatter).InitPercent)
|
|
|
|
// PerMille formats a number as a per mille indication. A value of 1.0 means
|
|
// 1000‰.
|
|
func PerMille(x interface{}, opts ...Option) Formatter {
|
|
return newFormatter(perMilleOptions, opts, x)
|
|
}
|
|
|
|
var perMilleOptions = newOptions(decimalVerbs, (*number.Formatter).InitPerMille)
|
|
|
|
// TODO:
|
|
// - Shortest: akin to verb 'g' of 'G'
|
|
//
|
|
// TODO: RBNF forms:
|
|
// - Compact: 1M 3.5T
|
|
// - CompactBinary: 1Mi 3.5Ti
|
|
// - Long: 1 million
|
|
// - Ordinal:
|
|
// - Roman: MCMIIXX
|
|
// - RomanSmall: mcmiixx
|
|
// - Text: numbers as it typically appears in running text, allowing
|
|
// language-specific choices for when to use numbers and when to use words.
|
|
// - Spell?: spelled-out number. Maybe just allow as an option?
|
|
|
|
// NOTE: both spelled-out numbers and ordinals, to render correctly, need
|
|
// detailed linguistic information from the translated string into which they
|
|
// are substituted. We will need to implement that first.
|