| author | Jens Alfke <jens@mooseyard.com> |
| Thu Mar 20 09:05:58 2008 -0700 (2008-03-20) | |
| changeset 1 | e55a17cdabd2 |
| parent 0 | d84d25d6cdbb |
| child 11 | e5976864dfe9 |
| permissions | -rw-r--r-- |
| jens@0 | 1 |
// |
| jens@0 | 2 |
// TimeIntervalFormatter.m |
| jens@0 | 3 |
// MYUtilities |
| jens@0 | 4 |
// |
| jens@0 | 5 |
// Copyright 2008 Jens Alfke. All rights reserved. |
| jens@0 | 6 |
// |
| jens@0 | 7 |
|
| jens@0 | 8 |
#import "TimeIntervalFormatter.h" |
| jens@0 | 9 |
|
| jens@0 | 10 |
|
| jens@0 | 11 |
@implementation TimeIntervalFormatter |
| jens@0 | 12 |
|
| jens@0 | 13 |
|
| jens@1 | 14 |
- (id) init |
| jens@1 | 15 |
{
|
| jens@1 | 16 |
self = [super init]; |
| jens@1 | 17 |
if (self != nil) {
|
| jens@1 | 18 |
_showsMinutes = YES; |
| jens@1 | 19 |
} |
| jens@1 | 20 |
return self; |
| jens@1 | 21 |
} |
| jens@1 | 22 |
|
| jens@0 | 23 |
- (void) awakeFromNib |
| jens@0 | 24 |
{
|
| jens@0 | 25 |
_showsMinutes = YES; |
| jens@0 | 26 |
} |
| jens@0 | 27 |
|
| jens@0 | 28 |
- (void) setShowsMinutes: (BOOL)show {_showsMinutes = show;}
|
| jens@0 | 29 |
- (void) setShowsFractionalSeconds: (BOOL)show {_showsFractionalSeconds = show;}
|
| jens@0 | 30 |
|
| jens@1 | 31 |
+ (NSString*) formatTimeInterval: (NSTimeInterval)interval |
| jens@1 | 32 |
{
|
| jens@1 | 33 |
TimeIntervalFormatter *fmt = [[self alloc] init]; |
| jens@1 | 34 |
NSString *result = [fmt stringForObjectValue: [NSNumber numberWithDouble: interval]]; |
| jens@1 | 35 |
[fmt release]; |
| jens@1 | 36 |
return result; |
| jens@1 | 37 |
} |
| jens@1 | 38 |
|
| jens@0 | 39 |
|
| jens@0 | 40 |
- (NSString*) stringForObjectValue: (id)object |
| jens@0 | 41 |
{
|
| jens@0 | 42 |
if (![object isKindOfClass:[NSNumber class]]) |
| jens@0 | 43 |
return nil; |
| jens@0 | 44 |
NSTimeInterval time = [object doubleValue]; |
| jens@0 | 45 |
NSString *sign; |
| jens@0 | 46 |
if( time==0.0 ) |
| jens@0 | 47 |
return nil; |
| jens@0 | 48 |
else if( time < 0.0 ) {
|
| jens@0 | 49 |
sign = @"-"; |
| jens@0 | 50 |
time = -time; |
| jens@0 | 51 |
} else |
| jens@0 | 52 |
sign = @""; |
| jens@0 | 53 |
if( ! _showsFractionalSeconds ) |
| jens@0 | 54 |
time = floor(time); |
| jens@0 | 55 |
int minutes = (int)floor(time / 60.0); |
| jens@0 | 56 |
if( _showsMinutes || minutes>0 ) {
|
| jens@0 | 57 |
double seconds = time - 60.0*minutes; |
| jens@0 | 58 |
return [NSString stringWithFormat: (_showsFractionalSeconds ?@"%@%d:%06.3lf" :@"%@%d:%02.0lf"), |
| jens@0 | 59 |
sign,minutes,seconds]; |
| jens@0 | 60 |
} else {
|
| jens@0 | 61 |
return [NSString stringWithFormat: (_showsFractionalSeconds ?@"%@%.3lf" :@"%@%.0lf"), |
| jens@0 | 62 |
sign,time]; |
| jens@0 | 63 |
} |
| jens@0 | 64 |
} |
| jens@0 | 65 |
|
| jens@0 | 66 |
|
| jens@0 | 67 |
- (BOOL)getObjectValue:(id *)anObject |
| jens@0 | 68 |
forString:(NSString *)string |
| jens@0 | 69 |
errorDescription:(NSString **)error |
| jens@0 | 70 |
{
|
| jens@0 | 71 |
NSScanner *scanner = [NSScanner scannerWithString: string]; |
| jens@0 | 72 |
[scanner setCharactersToBeSkipped: [NSCharacterSet whitespaceCharacterSet]]; |
| jens@0 | 73 |
double seconds; |
| jens@0 | 74 |
if( [scanner isAtEnd] ) {
|
| jens@0 | 75 |
seconds = 0.0; |
| jens@0 | 76 |
} else {
|
| jens@0 | 77 |
if( ! [scanner scanDouble: &seconds] || seconds<0.0 ) goto error; |
| jens@0 | 78 |
if( [scanner scanString: @":" intoString: NULL] ) {
|
| jens@0 | 79 |
double minutes = seconds; |
| jens@0 | 80 |
if( ! [scanner scanDouble: &seconds] || seconds<0.0 ) goto error; |
| jens@0 | 81 |
seconds += 60*minutes; |
| jens@0 | 82 |
} |
| jens@0 | 83 |
if( ! [scanner isAtEnd] ) goto error; |
| jens@0 | 84 |
} |
| jens@0 | 85 |
*anObject = [NSNumber numberWithDouble: seconds]; |
| jens@0 | 86 |
return YES; |
| jens@0 | 87 |
|
| jens@0 | 88 |
error: |
| jens@0 | 89 |
*anObject = nil; |
| jens@0 | 90 |
if( error ) |
| jens@0 | 91 |
*error = @"Not a valid time interval"; |
| jens@0 | 92 |
return NO; |
| jens@0 | 93 |
} |
| jens@0 | 94 |
|
| jens@0 | 95 |
|
| jens@0 | 96 |
- (BOOL)isPartialStringValid:(NSString **)partialStringPtr |
| jens@0 | 97 |
proposedSelectedRange:(NSRangePointer)proposedSelRangePtr |
| jens@0 | 98 |
originalString:(NSString *)origString |
| jens@0 | 99 |
originalSelectedRange:(NSRange)origSelRange |
| jens@0 | 100 |
errorDescription:(NSString **)error |
| jens@0 | 101 |
{
|
| jens@0 | 102 |
static NSCharacterSet *sIllegalChars; |
| jens@0 | 103 |
if( ! sIllegalChars ) |
| jens@0 | 104 |
sIllegalChars = [[[NSCharacterSet characterSetWithCharactersInString: @"0123456789.:"] |
| jens@0 | 105 |
invertedSet] retain]; |
| jens@0 | 106 |
return [*partialStringPtr rangeOfCharacterFromSet: sIllegalChars].length == 0; |
| jens@0 | 107 |
} |
| jens@0 | 108 |
|
| jens@0 | 109 |
|
| jens@0 | 110 |
@end |