47 lines
1.3 KiB
Go
47 lines
1.3 KiB
Go
package kubernetes
|
|
|
|
import (
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
const defaultPercentageValuePrecision = 3
|
|
|
|
// percentageValue is int64 form of percentage value with 10^-3 precision.
|
|
type percentageValue int64
|
|
|
|
// toFloat64 returns its decimal float64 value.
|
|
func (v percentageValue) toFloat64() float64 {
|
|
return float64(v) / (1000 * 100)
|
|
}
|
|
|
|
func (v percentageValue) computeWeight(count int) int {
|
|
if count == 0 {
|
|
return 0
|
|
}
|
|
return int(float64(v) / float64(count))
|
|
}
|
|
|
|
// String returns its string form of percentage value.
|
|
func (v percentageValue) String() string {
|
|
return strconv.FormatFloat(v.toFloat64()*100, 'f', defaultPercentageValuePrecision, 64) + "%"
|
|
}
|
|
|
|
// newPercentageValueFromString tries to read percentage value from string, it can be either "1.1" or "1.1%", "6%".
|
|
// It will lose the extra precision if there are more digits after decimal point.
|
|
func newPercentageValueFromString(rawValue string) (percentageValue, error) {
|
|
if strings.HasSuffix(rawValue, "%") {
|
|
rawValue = rawValue[:len(rawValue)-1]
|
|
}
|
|
value, err := strconv.ParseFloat(rawValue, 64)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
return newPercentageValueFromFloat64(value) / 100, nil
|
|
}
|
|
|
|
// newPercentageValueFromFloat64 reads percentage value from float64
|
|
func newPercentageValueFromFloat64(f float64) percentageValue {
|
|
return percentageValue(f * (1000 * 100))
|
|
}
|