feat: More fine grained time display

This commit is contained in:
Linnea Gräf
2024-11-10 17:32:05 +01:00
parent 4d0a73030d
commit d1241fb0d9
2 changed files with 54 additions and 48 deletions

View File

@@ -1,59 +1,65 @@
package moe.nea.firmament.util package moe.nea.firmament.util
import com.google.common.math.IntMath.pow import com.google.common.math.IntMath.pow
import kotlin.math.absoluteValue import kotlin.math.absoluteValue
import kotlin.time.Duration import kotlin.time.Duration
import kotlin.time.Duration.Companion.seconds
object FirmFormatters { object FirmFormatters {
fun formatCommas(int: Int, segments: Int = 3): String = formatCommas(int.toLong(), segments) fun formatCommas(int: Int, segments: Int = 3): String = formatCommas(int.toLong(), segments)
fun formatCommas(long: Long, segments: Int = 3): String { fun formatCommas(long: Long, segments: Int = 3): String {
val α = long / 1000 val α = long / 1000
if (α != 0L) { if (α != 0L) {
return formatCommas(α, segments) + "," + (long - α * 1000).toString().padStart(3, '0') return formatCommas(α, segments) + "," + (long - α * 1000).toString().padStart(3, '0')
} }
return long.toString() return long.toString()
} }
fun formatCommas(float: Float, fractionalDigits: Int): String = formatCommas(float.toDouble(), fractionalDigits) fun formatCommas(float: Float, fractionalDigits: Int): String = formatCommas(float.toDouble(), fractionalDigits)
fun formatCommas(double: Double, fractionalDigits: Int): String { fun formatCommas(double: Double, fractionalDigits: Int): String {
val long = double.toLong() val long = double.toLong()
val δ = (double - long).absoluteValue val δ = (double - long).absoluteValue
val μ = pow(10, fractionalDigits) val μ = pow(10, fractionalDigits)
val digits = (μ * δ).toInt().toString().padStart(fractionalDigits, '0').trimEnd('0') val digits = (μ * δ).toInt().toString().padStart(fractionalDigits, '0').trimEnd('0')
return formatCommas(long) + (if (digits.isEmpty()) "" else ".$digits") return formatCommas(long) + (if (digits.isEmpty()) "" else ".$digits")
} }
fun formatDistance(distance: Double): String { fun formatDistance(distance: Double): String {
if (distance < 10) if (distance < 10)
return "%.1fm".format(distance) return "%.1fm".format(distance)
return "%dm".format(distance.toInt()) return "%dm".format(distance.toInt())
} }
fun formatTimespan(duration: Duration, millis: Boolean = false): String { fun formatTimespan(duration: Duration, millis: Boolean = false): String {
if (duration.isInfinite()) { if (duration.isInfinite()) {
return if (duration.isPositive()) "" return if (duration.isPositive()) ""
else "-∞" else "-∞"
} }
val sb = StringBuilder() val sb = StringBuilder()
if (duration.isNegative()) sb.append("-") if (duration.isNegative()) sb.append("-")
duration.toComponents { days, hours, minutes, seconds, nanoseconds -> duration.toComponents { days, hours, minutes, seconds, nanoseconds ->
if (days > 0) { if (days > 0) {
sb.append(days).append("d") sb.append(days).append("d")
} }
if (hours > 0) { if (hours > 0) {
sb.append(hours).append("h") sb.append(hours).append("h")
} }
if (minutes > 0) { if (minutes > 0) {
sb.append(minutes).append("m") sb.append(minutes).append("m")
} }
sb.append(seconds).append("s") val milliTime = nanoseconds / 1_000_000
if (millis) { val deciseconds = milliTime / 100
sb.append(nanoseconds / 1_000_000).append("ms") if (millis) {
} sb.append(seconds).append("s")
} sb.append(milliTime).append("ms")
return sb.toString() } else if (duration.absoluteValue < 5.seconds && deciseconds != 0) {
} sb.append(seconds).append('.').append(deciseconds.digitToChar()).append("s")
} else {
sb.append(seconds).append("s")
}
Unit
}
return sb.toString()
}
} }

View File

@@ -90,7 +90,7 @@ fun CharSequence.removeColorCodes(keepNonColorCodes: Boolean = false): String {
} }
val Text.unformattedString: String val Text.unformattedString: String
get() = string.removeColorCodes() get() = string.removeColorCodes() // TODO: maybe shortcircuit this with .visit
val Text.directLiteralStringContent: String? get() = (this.content as? PlainTextContent)?.string() val Text.directLiteralStringContent: String? get() = (this.content as? PlainTextContent)?.string()