diff --git a/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt b/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt index 6e641234387..4df013208eb 100644 --- a/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt +++ b/libraries/stdlib/jvm/src/kotlin/time/formatToDecimals.kt @@ -34,4 +34,4 @@ internal actual fun formatUpToDecimals(value: Double, decimals: Int): String = private val scientificFormat = ThreadLocal() internal actual fun formatScientific(value: Double): String = - scientificFormat.getOrSet { DecimalFormat("0E0", rootFormatSymbols).apply { maximumFractionDigits = 2 } }.format(value) \ No newline at end of file + scientificFormat.getOrSet { DecimalFormat("0E0", rootFormatSymbols).apply { minimumFractionDigits = 2 } }.format(value) \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/time/Duration.kt b/libraries/stdlib/src/kotlin/time/Duration.kt index cdb85e35d79..7690d94a2aa 100644 --- a/libraries/stdlib/src/kotlin/time/Duration.kt +++ b/libraries/stdlib/src/kotlin/time/Duration.kt @@ -279,7 +279,11 @@ public inline class Duration internal constructor(internal val value: Double) : public fun toString(unit: DurationUnit, decimals: Int = 0): String { require(decimals >= 0) { "decimals must be not negative, but was $decimals" } if (isInfinite()) return value.toString() - return formatToExactDecimals(toDouble(unit), decimals) + unit.shortName() + val number = toDouble(unit) + return when { + abs(number) < 1e14 -> formatToExactDecimals(number, decimals.coerceAtMost(12)) + else -> formatScientific(number) + } + unit.shortName() } diff --git a/libraries/stdlib/test/time/DurationTest.kt b/libraries/stdlib/test/time/DurationTest.kt index 67b138c439d..ad19ed2aae7 100644 --- a/libraries/stdlib/test/time/DurationTest.kt +++ b/libraries/stdlib/test/time/DurationTest.kt @@ -308,12 +308,13 @@ class DurationTest { d = (d - 516.nanoseconds) / 17 test(DurationUnit.NANOSECONDS, "0ns", "0.0ns", "0.02ns", "0.020ns", "0.0202ns") - testOnJvm { - d = Double.MAX_VALUE.nanoseconds - // are such long representations ok? - test(DurationUnit.DAYS, "20806633505350875${"0".repeat(278)}d") - test(DurationUnit.NANOSECONDS, "17976931348623157${"0".repeat(292)}ns") - } + d = Double.MAX_VALUE.nanoseconds + test(DurationUnit.DAYS, "2.08e294d") + test(DurationUnit.NANOSECONDS, "1.80e308ns") + + assertEquals("0.500000000000s", 0.5.seconds.toString(DurationUnit.SECONDS, 100)) + assertEquals("99999000000000.000000000000ns", 99_999.seconds.toString(DurationUnit.NANOSECONDS, 15)) + assertEquals("1.00e14ns", 100_000.seconds.toString(DurationUnit.NANOSECONDS, 9)) d = Duration.INFINITE test(DurationUnit.DAYS, "Infinity", "Infinity")