Formatted print for Duration
Hello, I do not see how to do a formatted print from a duration. I would like to be able to do something like: String streamContents: [ :s | 90 minutes formatted: âhh:mmâ printOn: s ] The Duration>>#printOn: method prints the ANSI 5.8.2.16 format: [-]D:HH:MM:SS[.S] The Duration>>#printHumanReadableOn: is not printing in the format I want. Am I missing something or such feature does not exist actually? Julien --- Julien Delplanque Doctorant à lâUniversité de Lille 1 http://juliendelplanque.be/phd.html Equipe Rmod, Inria Bâtiment B 40, avenue Halley 59650 Villeneuve d'Ascq Numéro de téléphone: +333 59 35 86 40
Am 03.01.18 um 14:07 schrieb Julien:
Hello,
I do not see how to do a formatted print from a duration.
I would like to be able to do something like:
String streamContents: [ :s | 90 minutes formatted: âhh:mmâ printOn: s ]
The Duration>>#printOn: method prints the ANSI 5.8.2.16 format: [-]D:HH:MM:SS[.S]
The Duration>>#printHumanReadableOn: is not printing in the format I want.
Am I missing something or such feature does not exist actually?
Hi Julien I did not find a ready made method for that, either. Probably because there is no standard way to print a *Duration* as minutes and seconds, because it is not obvious how to print it (Compared to instances of the *Time* class). My solution would be to implement your own printing method using the GRPrinter from the Grease package (Installable through Catalog Browser in Pharo 6): ***************************** | hoursPrinter minutesPrinter printer | "Note: you can not use 'duration minutes', since this will give you only the partial minutes inside a day" hoursPrinter := GRMappedPrinter block: [ :duration | duration asMinutes // 60 ] next: (GRNumberPrinter new). minutesPrinter := GRMappedPrinter block: [ :duration | duration minutes ] next: (GRPrinter numberWithAtLeastDigits: 2). printer := hoursPrinter, $:, minutesPrinter. ^printer print: (9876 minutes) "Will result in '164:36'" ***************************** 2. solution: Or just dead simple: ***************************** | duration | duration := (9876 minutes). ^(duration asMinutes // 60) asString, ':', duration minutes asTwoCharacterString ***************************** Cheers, Andreas -- Andreas Brodbeck www.mindclue.ch
I chosen something like the second solution to avoid adding a dependency to my project (it is a bit overkill for what I wanted to achieve). But shouldnât this formatted-print feature be added in Duration? Julien --- Julien Delplanque Doctorant à lâUniversité de Lille 1 http://juliendelplanque.be/phd.html Equipe Rmod, Inria Bâtiment B 40, avenue Halley 59650 Villeneuve d'Ascq Numéro de téléphone: +333 59 35 86 40
Le 3 janv. 2018 à 23:02, Andreas Brodbeck <dassi@mindclue.ch> a écrit :
Am 03.01.18 um 14:07 schrieb Julien:
Hello,
I do not see how to do a formatted print from a duration.
I would like to be able to do something like:
String streamContents: [ :s | 90 minutes formatted: âhh:mmâ printOn: s ]
The Duration>>#printOn: method prints the ANSI 5.8.2.16 format: [-]D:HH:MM:SS[.S]
The Duration>>#printHumanReadableOn: is not printing in the format I want.
Am I missing something or such feature does not exist actually?
Hi Julien
I did not find a ready made method for that, either. Probably because there is no standard way to print a *Duration* as minutes and seconds, because it is not obvious how to print it (Compared to instances of the *Time* class).
My solution would be to implement your own printing method using the GRPrinter from the Grease package (Installable through Catalog Browser in Pharo 6):
*****************************
| hoursPrinter minutesPrinter printer |
"Note: you can not use 'duration minutes', since this will give you only the partial minutes inside a day" hoursPrinter := GRMappedPrinter block: [ :duration | duration asMinutes // 60 ] next: (GRNumberPrinter new).
minutesPrinter := GRMappedPrinter block: [ :duration | duration minutes ] next: (GRPrinter numberWithAtLeastDigits: 2).
printer := hoursPrinter, $:, minutesPrinter.
^printer print: (9876 minutes) "Will result in '164:36'"
*****************************
2. solution: Or just dead simple:
*****************************
| duration | duration := (9876 minutes).
^(duration asMinutes // 60) asString, ':', duration minutes asTwoCharacterString
*****************************
Cheers, Andreas
-- Andreas Brodbeck www.mindclue.ch <http://www.mindclue.ch/>
Hi julien Yes it would be nice :) Stef On Thu, Jan 4, 2018 at 2:28 PM, Julien <julien.delplanque@inria.fr> wrote:
I chosen something like the second solution to avoid adding a dependency to my project (it is a bit overkill for what I wanted to achieve). But shouldnât this formatted-print feature be added in Duration?
Julien
--- Julien Delplanque Doctorant à lâUniversité de Lille 1 http://juliendelplanque.be/phd.html Equipe Rmod, Inria Bâtiment B 40, avenue Halley 59650 Villeneuve d'Ascq Numéro de téléphone: +333 59 35 86 40
Le 3 janv. 2018 à 23:02, Andreas Brodbeck <dassi@mindclue.ch> a écrit :
Am 03.01.18 um 14:07 schrieb Julien:
Hello,
I do not see how to do a formatted print from a duration.
I would like to be able to do something like:
String streamContents: [ :s | 90 minutes formatted: âhh:mmâ printOn: s ]
The Duration>>#printOn: method prints the ANSI 5.8.2.16 format: [-]D:HH:MM:SS[.S]
The Duration>>#printHumanReadableOn: is not printing in the format I want.
Am I missing something or such feature does not exist actually?
Hi Julien
I did not find a ready made method for that, either. Probably because there is no standard way to print a *Duration* as minutes and seconds, because it is not obvious how to print it (Compared to instances of the *Time* class).
My solution would be to implement your own printing method using the GRPrinter from the Grease package (Installable through Catalog Browser in Pharo 6):
*****************************
| hoursPrinter minutesPrinter printer |
"Note: you can not use 'duration minutes', since this will give you only the partial minutes inside a day" hoursPrinter := GRMappedPrinter block: [ :duration | duration asMinutes // 60 ] next: (GRNumberPrinter new).
minutesPrinter := GRMappedPrinter block: [ :duration | duration minutes ] next: (GRPrinter numberWithAtLeastDigits: 2).
printer := hoursPrinter, $:, minutesPrinter.
^printer print: (9876 minutes) "Will result in '164:36'"
*****************************
2. solution: Or just dead simple:
*****************************
| duration | duration := (9876 minutes).
^(duration asMinutes // 60) asString, ':', duration minutes asTwoCharacterString
*****************************
Cheers, Andreas
-- Andreas Brodbeck www.mindclue.ch
participants (3)
-
Andreas Brodbeck -
Julien -
Stephane Ducasse