From 39f116233fa4fab2b1efc160bc26d9369ab9ba1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20Qu=C3=A8ze?= Date: Tue, 16 May 2023 07:38:37 +0200 Subject: [PATCH] Add the minute and hour units for duration formats (eg. profile range duration). --- src/test/unit/marker-schema.test.js | 4 ++- src/utils/format-numbers.js | 44 ++++++++++++++++++++++++++++- 2 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/test/unit/marker-schema.test.js b/src/test/unit/marker-schema.test.js index e2b0f93bac..96a430abea 100644 --- a/src/test/unit/marker-schema.test.js +++ b/src/test/unit/marker-schema.test.js @@ -192,6 +192,7 @@ describe('marker schema formatting', function () { ['duration', 10], ['duration', 12.3456789], ['duration', 123456.789], + ['duration', 123456789], ['duration', 0.000123456], ['time', 12.3456789], ['seconds', 0], @@ -250,7 +251,8 @@ describe('marker schema formatting', function () { "duration - 0s", "duration - 10ms", "duration - 12.346ms", - "duration - 123.46s", + "duration - 2.06min", + "duration - 34.3h", "duration - 123.46ns", "time - 12.346ms", "seconds - 0.000s", diff --git a/src/utils/format-numbers.js b/src/utils/format-numbers.js index 0fed3e3321..da4e6731ce 100644 --- a/src/utils/format-numbers.js +++ b/src/utils/format-numbers.js @@ -244,13 +244,55 @@ export function formatSeconds( ); } +export function formatMinutes( + time: Milliseconds, + significantDigits: number = 5, + maxFractionalDigits: number = 2 +) { + return ( + formatNumber( + time / (60 * 1000), + significantDigits, + Math.min(2, maxFractionalDigits) + ) + 'min' + ); +} + +export function formatHours( + time: Milliseconds, + significantDigits: number = 5, + maxFractionalDigits: number = 1 +) { + return ( + formatNumber( + time / (3600 * 1000), + significantDigits, + Math.min(1, maxFractionalDigits) + ) + 'h' + ); +} + export function formatTimestamp( time: Milliseconds, significantDigits: number = 5, maxFractionalDigits: number = 3 ) { - // Format in the closest base (seconds, milliseconds, microseconds, or nanoseconds), + // Format in the closest base (hours, minutes, seconds, milliseconds, microseconds, or nanoseconds), // to avoid cases where times are displayed with too many leading zeroes to be useful. + if (time >= 3600 * 1000) { + return formatHours( + time, + significantDigits, + Number.isInteger(time / (3600 * 1000)) ? 0 : maxFractionalDigits + ); + } + if (time >= 60 * 1000) { + return formatMinutes( + time, + significantDigits, + Number.isInteger(time / (60 * 1000)) ? 0 : maxFractionalDigits + ); + } if (time >= 1000) { return formatSeconds( time,