2024-06-19 02:44:24 +00:00
|
|
|
package pretty
|
|
|
|
|
|
|
|
import (
|
2024-06-30 13:19:20 +00:00
|
|
|
"errors"
|
2024-06-19 02:44:24 +00:00
|
|
|
"fmt"
|
|
|
|
"math"
|
2024-06-30 13:19:20 +00:00
|
|
|
"strconv"
|
2024-06-19 02:44:24 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func PrettyPrintInt(n int) {
|
|
|
|
switch {
|
|
|
|
case math.Abs(float64(n)) >= 1_000_000_000_000:
|
|
|
|
fmt.Printf("%dT", n/1_000_000_000_000)
|
|
|
|
case math.Abs(float64(n)) >= 1_000_000_000:
|
|
|
|
fmt.Printf("%dB", n/1_000_000_000)
|
|
|
|
case math.Abs(float64(n)) >= 1_000_000:
|
|
|
|
fmt.Printf("%dM", n/1_000_000)
|
|
|
|
case math.Abs(float64(n)) >= 1_000:
|
|
|
|
fmt.Printf("%dK", n/1_000)
|
|
|
|
default:
|
|
|
|
fmt.Printf("%df", n)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func PrettyPrintFloat(f float64) {
|
|
|
|
switch {
|
|
|
|
case math.Abs(f) >= 1_000_000_000_000:
|
|
|
|
fmt.Printf("%.1fT", f/1_000_000_000_000)
|
|
|
|
case math.Abs(f) >= 1_000_000_000:
|
|
|
|
fmt.Printf("%.1fB", f/1_000_000_000)
|
|
|
|
case math.Abs(f) >= 1_000_000:
|
|
|
|
fmt.Printf("%.1fM", f/1_000_000)
|
|
|
|
case math.Abs(f) >= 1_000:
|
|
|
|
fmt.Printf("%.1fK", f/1_000)
|
|
|
|
|
|
|
|
case math.Abs(f) <= 0.0001:
|
|
|
|
fmt.Printf("%.5f", f)
|
|
|
|
case math.Abs(f) <= 0.001:
|
|
|
|
fmt.Printf("%.4f", f)
|
|
|
|
case math.Abs(f) <= 0.01:
|
|
|
|
fmt.Printf("%.3f", f)
|
|
|
|
case math.Abs(f) <= 0.1:
|
|
|
|
fmt.Printf("%.2f", f)
|
|
|
|
default:
|
|
|
|
fmt.Printf("%.1f", f)
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
func PrettyPrint2Floats(low float64, high float64) {
|
|
|
|
PrettyPrintFloat(low)
|
|
|
|
fmt.Printf(" ")
|
|
|
|
PrettyPrintFloat(high)
|
|
|
|
}
|
2024-06-30 13:19:20 +00:00
|
|
|
|
|
|
|
func multiplyOrPassThroughError(a float64, b float64, err error) (float64, error) {
|
|
|
|
if err != nil {
|
|
|
|
return b, err
|
|
|
|
} else {
|
|
|
|
return a * b, nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-30 13:30:55 +00:00
|
|
|
func ParseFloat(word string) (float64, error) {
|
2024-06-30 13:19:20 +00:00
|
|
|
// l = len(word) // assuming no UTF stuff
|
|
|
|
|
2024-06-30 13:22:04 +00:00
|
|
|
switch len(word) {
|
|
|
|
case 0:
|
2024-06-30 13:19:20 +00:00
|
|
|
return 0, errors.New("String to be parsed into float must not be the empty string")
|
2024-06-30 13:22:04 +00:00
|
|
|
case 1:
|
|
|
|
return strconv.ParseFloat(word, 64)
|
2024-06-30 13:19:20 +00:00
|
|
|
}
|
|
|
|
|
2024-06-30 13:22:04 +00:00
|
|
|
n := len(word) - 1
|
|
|
|
f, err := strconv.ParseFloat(word[:n], 64)
|
2024-06-30 13:19:20 +00:00
|
|
|
switch word[n] {
|
2024-06-30 13:22:04 +00:00
|
|
|
case 'K':
|
2024-06-30 13:19:20 +00:00
|
|
|
return multiplyOrPassThroughError(1_000, f, err)
|
2024-06-30 13:22:04 +00:00
|
|
|
case 'M':
|
2024-06-30 13:19:20 +00:00
|
|
|
return multiplyOrPassThroughError(1_000_000, f, err)
|
2024-06-30 13:22:04 +00:00
|
|
|
case 'B':
|
2024-06-30 13:19:20 +00:00
|
|
|
return multiplyOrPassThroughError(1_000_000_000, f, err)
|
2024-06-30 13:22:04 +00:00
|
|
|
case 'T':
|
|
|
|
return multiplyOrPassThroughError(1_000_000_000_000, f, err)
|
2024-06-30 13:19:20 +00:00
|
|
|
default:
|
2024-06-30 13:22:04 +00:00
|
|
|
return f, err
|
2024-06-30 13:19:20 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|