feat: More fine grained time display
This commit is contained in:
@@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user