aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/util/FirmFormatters.kt
diff options
context:
space:
mode:
authorLinnea Gräf <nea@nea.moe>2024-08-28 19:04:24 +0200
committerLinnea Gräf <nea@nea.moe>2024-08-28 19:04:24 +0200
commitd2f240ff0ca0d27f417f837e706c781a98c31311 (patch)
tree0db7aff6cc14deaf36eed83889d59fd6b3a6f599 /src/main/kotlin/util/FirmFormatters.kt
parenta6906308163aa3b2d18fa1dc1aa71ac9bbcc83ab (diff)
downloadFirmament-d2f240ff0ca0d27f417f837e706c781a98c31311.tar.gz
Firmament-d2f240ff0ca0d27f417f837e706c781a98c31311.tar.bz2
Firmament-d2f240ff0ca0d27f417f837e706c781a98c31311.zip
Refactor source layout
Introduce compat source sets and move all kotlin sources to the main directory [no changelog]
Diffstat (limited to 'src/main/kotlin/util/FirmFormatters.kt')
-rw-r--r--src/main/kotlin/util/FirmFormatters.kt59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/main/kotlin/util/FirmFormatters.kt b/src/main/kotlin/util/FirmFormatters.kt
new file mode 100644
index 0000000..c3bdd16
--- /dev/null
+++ b/src/main/kotlin/util/FirmFormatters.kt
@@ -0,0 +1,59 @@
+
+
+package moe.nea.firmament.util
+
+import com.google.common.math.IntMath.pow
+import kotlin.math.absoluteValue
+import kotlin.time.Duration
+
+object FirmFormatters {
+ fun formatCommas(int: Int, segments: Int = 3): String = formatCommas(int.toLong(), segments)
+ fun formatCommas(long: Long, segments: Int = 3): String {
+ val α = long / 1000
+ if (α != 0L) {
+ return formatCommas(α, segments) + "," + (long - α * 1000).toString().padStart(3, '0')
+ }
+ return long.toString()
+ }
+
+ fun formatCommas(float: Float, fractionalDigits: Int): String = formatCommas(float.toDouble(), fractionalDigits)
+ fun formatCommas(double: Double, fractionalDigits: Int): String {
+ val long = double.toLong()
+ val δ = (double - long).absoluteValue
+ val μ = pow(10, fractionalDigits)
+ val digits = (μ * δ).toInt().toString().padStart(fractionalDigits, '0').trimEnd('0')
+ return formatCommas(long) + (if (digits.isEmpty()) "" else ".$digits")
+ }
+
+ fun formatDistance(distance: Double): String {
+ if (distance < 10)
+ return "%.1fm".format(distance)
+ return "%dm".format(distance.toInt())
+ }
+
+ fun formatTimespan(duration: Duration, millis: Boolean = false): String {
+ if (duration.isInfinite()) {
+ return if (duration.isPositive()) "∞"
+ else "-∞"
+ }
+ val sb = StringBuilder()
+ if (duration.isNegative()) sb.append("-")
+ duration.toComponents { days, hours, minutes, seconds, nanoseconds ->
+ if (days > 0) {
+ sb.append(days).append("d")
+ }
+ if (hours > 0) {
+ sb.append(hours).append("h")
+ }
+ if (minutes > 0) {
+ sb.append(minutes).append("m")
+ }
+ sb.append(seconds).append("s")
+ if (millis) {
+ sb.append(nanoseconds / 1_000_000).append("ms")
+ }
+ }
+ return sb.toString()
+ }
+
+}