how to round durations to most significant unit ? (5 secs, 889 ms, and 811 μs => 5 secs)
Steven Schveighoffer
schveiguy at yahoo.com
Sat Feb 15 19:13:07 PST 2014
On Fri, 14 Feb 2014 17:14:03 -0500, Jonathan M Davis <jmdavisProg at gmx.com>
wrote:
> On Thursday, February 13, 2014 23:37:13 Timothee Cour wrote:
>> Is there a function to do this?
>> If not and I/someone writes it, is there interest to add it to
>> std.datetime?
>>
>> Duration t = ...;
>> t.to!string => 5 secs, 889 ms, and 811 μs
>> t.round.to!string => 5 secs
>>
>> t=...;
>> t.to!string => 889 ms, and 811 μs
>> t.round.to!string => 889 secs
>>
>> Use case: shorter logs.
>
> There is no function for that, and no one's ever asked for anything like
> it,
> so I don't know how worthwhile it is to add. However, one possible
> implementation would be
>
> auto roundToLargest(Duration d)
> {
> foreach(units; TypeTuple!("weeks", "days", "hours", "minutes",
> "seconds", "msecs", "usecs"))
> {
> immutable value = d.total!units();
> if(value != 0)
> return dur!units(value);
> }
>
> return d;
> }
You are doing the calculation for every test.
Better:
if(d >= dur!units(1))
...
Now, I think that the dur!units(1) should be statically determined, but if
not, I think you could make it statically determined via enum.
-Steve
More information about the Digitalmars-d-learn
mailing list