in reply to Convert time string to seconds
I have some concerns about your approach.
The formats you list,
min:sec,frac e.g. "5:29,11" sec,frac e.g. "29,11" sec e.g. "29" ,frac e.g. ",11" min:sec e.g. "5:29" someth. else e.g. "abc"
are not normalized. In consequence, you provide no coverage of possibilities such as 5:29,3, which appears to be at least theoretically possible in your schema. Were you to begin by normalizing the data to mm:ss,frac, writing a reliable conversion to seconds would be both more reliable and easier (and which is left as an exercise for the user).
That said, and accepting the un-normalized data, suhailck's solution has much to commend it, but also has a couple glitches:
So, in part TIMTOWTDI, and in part, perhaps by way of improvement:
#!/usr/bin/perl use strict; use warnings; # 855222 # 1) min:sec,frac e.g. "5:29,11" # 2) sec,frac e.g. "29,11" # 3) sec e.g. "29" # 4) ,frac e.g. ",11" # 5) min:sec e.g. "5:29" # 6) someth. else e.g. "abc" my $seconds; my @times=("5:29,11", "29,11", "29:00", "29:00,3", "29:00,303","29:13, +07", ",11", "0:11", "5:29", "abc", "1abc"); for my $time(@times) { no warnings 'uninitialized'; if ($time =~ /[a-z]/i) { # won't catch non-"time-ish" symbols s +uch as ?, #, @, etc # $seconds = -1; # my personal preference is for an explicit er +ror statement print "Data not recognized: $time\n"; next; } else { ($seconds = $time) =~ s<^(?:(\d+):)?(\d+)?(?:,(\d+))?$><$1*60+$2+$ +3/(10**length($3))>e; } print "$time = $seconds \n"; }
which produces:
5:29,11 = 329.11 29,11 = 29.11 29:00 = 1740 29:00,3 = 1740.3 29:00,303 = 1740.303 29:13,07 = 1753.07 ,11 = 0.11 0:11 = 11 5:29 = 329 Data not recognized: abc Data not recognized: 1abc
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Convert time string to seconds
by Dirk80 (Pilgrim) on Aug 17, 2010 at 11:20 UTC | |
by ww (Archbishop) on Aug 17, 2010 at 14:18 UTC |