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