diff --git a/libraries/stdlib/samples/test/samples/time/durations.kt b/libraries/stdlib/samples/test/samples/time/durations.kt index 351395e293f..b8fba255729 100644 --- a/libraries/stdlib/samples/test/samples/time/durations.kt +++ b/libraries/stdlib/samples/test/samples/time/durations.kt @@ -30,7 +30,7 @@ class Durations { assertPrints(Duration.minutes(1230), "20h 30m") assertPrints(Duration.minutes(920), "15h 20m") assertPrints(Duration.seconds(1.546), "1.546s") - assertPrints(Duration.milliseconds(25.12), "0.025120s") + assertPrints(Duration.milliseconds(25.12), "25.120ms") } @Sample diff --git a/libraries/stdlib/src/kotlin/time/Duration.kt b/libraries/stdlib/src/kotlin/time/Duration.kt index 69697c20fe9..687a23268a3 100644 --- a/libraries/stdlib/src/kotlin/time/Duration.kt +++ b/libraries/stdlib/src/kotlin/time/Duration.kt @@ -692,19 +692,16 @@ public value class Duration internal constructor(private val rawValue: Long) : C } if (hasSeconds) { if (length > 1) append(' ') - append(seconds) - if (nanoseconds != 0) { - append('.') - when { - (nanoseconds % 1_000_000 == 0) -> - append((nanoseconds / 1_000_000).toString().padStart(3, '0')) - (nanoseconds % 1_000 == 0) -> - append((nanoseconds / 1_000).toString().padStart(6, '0')) - else -> - append(nanoseconds.toString().padStart(9, '0')) - } + when { + seconds != 0 || hasDays || hasHours || hasMinutes -> + appendFractional(seconds, nanoseconds, "s") + nanoseconds >= 1_000_000 -> + appendFractional(nanoseconds / 1_000_000, nanoseconds % 1_000_000 * 1_000, "ms") + nanoseconds >= 1_000 -> + appendFractional(nanoseconds / 1_000, nanoseconds % 1_000 * 1_000_000, "us") + else -> + append(nanoseconds).append("ns") } - append('s') } } } @@ -712,11 +709,18 @@ public value class Duration internal constructor(private val rawValue: Long) : C } } - private fun precision(value: Double): Int = when { - value < 1 -> 3 - value < 10 -> 2 - value < 100 -> 1 - else -> 0 + private fun StringBuilder.appendFractional(whole: Int, nanoFractional: Int, unit: String) { + append(whole) + if (nanoFractional != 0) { + append('.') + val nanoString = nanoFractional.toString().padStart(9, '0') + when { + nanoFractional % 1_000_000 == 0 -> appendRange(nanoString, 0, 3) + nanoFractional % 1_000 == 0 -> appendRange(nanoString, 0, 6) + else -> append(nanoString) + } + } + append(unit) } /** @@ -771,17 +775,7 @@ public value class Duration internal constructor(private val rawValue: Long) : C append(minutes).append('M') } if (hasSeconds || (!hasHours && !hasMinutes)) { - append(seconds) - if (nanoseconds != 0) { - append('.') - val nss = nanoseconds.toString().padStart(9, '0') - when { - nanoseconds % 1_000_000 == 0 -> appendRange(nss, 0, 3) - nanoseconds % 1_000 == 0 -> appendRange(nss, 0, 6) - else -> append(nss) - } - } - append('S') + appendFractional(seconds, nanoseconds, "S") } } } diff --git a/libraries/stdlib/test/time/DurationTest.kt b/libraries/stdlib/test/time/DurationTest.kt index 2a070ab5183..de7f422bc69 100644 --- a/libraries/stdlib/test/time/DurationTest.kt +++ b/libraries/stdlib/test/time/DurationTest.kt @@ -568,26 +568,26 @@ class DurationTest { test(Duration.seconds(1.3), "1.300s") test(Duration.seconds(1), "1s") - test(Duration.seconds(0.5), "0.500s") - test(Duration.milliseconds(40.2), "0.040200s") - test(Duration.milliseconds(4.225), "0.004225s") - test(Duration.milliseconds(4.245), "0.004245s") - test(Duration.milliseconds(1), "0.001s") + test(Duration.seconds(0.5), "500ms") + test(Duration.milliseconds(40.2), "40.200ms") + test(Duration.milliseconds(4.225), "4.225ms") + test(Duration.milliseconds(4.24501), "4.245010ms") + test(Duration.milliseconds(1), "1ms") - test(Duration.milliseconds(0.75), "0.000750s") - test(Duration.microseconds(75.35), "0.000075350s") - test(Duration.microseconds(7.25), "0.000007250s") - test(Duration.microseconds(1.035), "0.000001035s") - test(Duration.microseconds(1.005), "0.000001005s") + test(Duration.milliseconds(0.75), "750us") + test(Duration.microseconds(75.35), "75.350us") + test(Duration.microseconds(7.25), "7.250us") + test(Duration.microseconds(1.035), "1.035us") + test(Duration.microseconds(1.005), "1.005us") - test(Duration.nanoseconds(950.5), "0.000000951s") - test(Duration.nanoseconds(85.23), "0.000000085s") - test(Duration.nanoseconds(8.235), "0.000000008s") - test(Duration.nanoseconds(1.3), "0.000000001s") + test(Duration.nanoseconds(950.5), "951ns") + test(Duration.nanoseconds(85.23), "85ns") + test(Duration.nanoseconds(8.235), "8ns") + test(Duration.nanoseconds(1.3), "1ns") + test(Duration.nanoseconds(0.75), "1ns") + test(Duration.nanoseconds(0.7512), "1ns") // equal to zero -// test(Duration.nanoseconds(0.75), "0.75ns") -// test(Duration.nanoseconds(0.7512), "0.7512ns") // test(Duration.nanoseconds(0.023), "0.023ns") // test(Duration.nanoseconds(0.0034), "0.0034ns") // test(Duration.nanoseconds(0.0000035), "0.0000035ns")