Skip to content

Commit e037425

Browse files
authored
Merge pull request #200 from Kotlin/fix/format-double-locale
format numbers with a fixed Locale
2 parents 6266b69 + b4a0599 commit e037425

File tree

4 files changed

+16
-8
lines changed

4 files changed

+16
-8
lines changed

runtime/commonMain/src/kotlinx/benchmark/ReportBenchmarksStatistics.kt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,13 @@ class ReportBenchmarksStatistics(values: DoubleArray) {
8686
}
8787
}
8888

89+
/**
90+
* Pretty formats a number.
91+
*
92+
* The locale must be fixed, so that decimals will be consistently formatted.
93+
* - `.` - decimal separator
94+
* - `,` - thousands separator
95+
*/
8996
internal expect fun Double.format(precision: Int, useGrouping: Boolean = true): String
9097

9198
fun Double.formatSignificant(precision: Int): String {
@@ -126,7 +133,7 @@ fun Double.sampleToText(mode: Mode, unit: BenchmarkTimeUnit): String {
126133

127134
@Suppress("REDUNDANT_ELSE_IN_WHEN")
128135
fun Double.nanosToSample(mode: Mode, unit: BenchmarkTimeUnit): Double {
129-
val multiplier = unit.toMultiplier() // unit in nanos
136+
val multiplier = unit.toMultiplier() // unit in nanos
130137
return when (mode) {
131138
Mode.Throughput -> multiplier / this
132139
Mode.AverageTime -> this / multiplier

runtime/jsMain/src/kotlinx/benchmark/UtilsJs.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ internal actual fun Double.format(precision: Int, useGrouping: Boolean): String
55
options.minimumFractionDigits = precision
66
options.maximumFractionDigits = precision
77
options.useGrouping = useGrouping
8-
return this.asDynamic().toLocaleString(undefined, options) as String
8+
return this.asDynamic().toLocaleString("en-GB", options) as String
99
}
1010

1111
internal actual fun String.writeFile(text: String): Unit = jsEngineSupport.writeFile(this, text)
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
package kotlinx.benchmark
22

3-
import java.io.*
3+
import java.io.File
4+
import java.util.*
45

56
internal actual fun Double.format(precision: Int, useGrouping: Boolean): String {
6-
return if (useGrouping) "%,.0${precision}f".format(this)
7-
else "%.0${precision}f".format(this)
7+
return if (useGrouping) "%,.0${precision}f".format(Locale.ROOT, this)
8+
else "%.0${precision}f".format(Locale.ROOT, this)
89
}
910

1011
internal actual fun String.readFile(): String {
@@ -15,4 +16,4 @@ internal actual fun String.writeFile(text: String) {
1516
File(this).writeText(text)
1617
}
1718

18-
internal actual inline fun measureNanoseconds(block: () -> Unit): Long = TODO("Not implemented for this platform")
19+
internal actual inline fun measureNanoseconds(block: () -> Unit): Long = TODO("Not implemented for this platform")

runtime/wasmJsMain/src/kotlinx/benchmark/Utils.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package kotlinx.benchmark
22

3-
@JsFun("(d, precision, useGrouping) => d.toLocaleString(undefined, { maximumFractionDigits: precision, minimumFractionDigits: precision, useGrouping: useGrouping } )")
3+
@JsFun("(d, precision, useGrouping) => d.toLocaleString('en-GB', { maximumFractionDigits: precision, minimumFractionDigits: precision, useGrouping: useGrouping } )")
44
private external fun format(d: Double, precision: Int, useGrouping: Boolean): String
55

66
internal actual fun Double.format(precision: Int, useGrouping: Boolean): String = format(this, precision, useGrouping)
@@ -31,4 +31,4 @@ internal val jsEngineSupport: JsEngineSupport by lazy {
3131
internal external interface ExternalInterfaceType
3232

3333
internal actual inline fun measureNanoseconds(block: () -> Unit): Long =
34-
if (isD8) d8MeasureTime(block) else nodeJsMeasureTime(block)
34+
if (isD8) d8MeasureTime(block) else nodeJsMeasureTime(block)

0 commit comments

Comments
 (0)