blob: f5ca93b15d27fcf335c1cd1c250440ab4b523b6b [file] [log] [blame]
// 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.