2010-04-24 64 views
0

請告訴我,以確保用戶的最佳方式已經進入了一個有效的時間字符串,如:確保用戶輸入正確格式的字符串?

5:24 5.4

102:30 102.5

它將被輸入到的UITextField因此將在NSString中。

我想讓用戶以小時和分鐘(hh:mm)或小時和小數分鐘(hh.m)輸入時間。

在小時分鐘示例中,他們應該能夠輸入儘可能多的小時數,但只能在0到59分鐘之間。隨着時間的小數分鐘,我希望他們只能再次進入儘可能多小時,因爲等,但是小數分只能是0 - 9

非常感謝

回答

1

如果您使用的是最新的非測試版SDK (3.2),您可以使用regular expressions

NSString *myString = @"5:24"; 
NSString *myRegex = @"^\\d+(?:[:](?:[0-5]?\\d)|\\.\\d)$"; 
NSRange myRange = [myString rangeOfString:myRegex options:NSRegularExpressionSearch]; 
if (myRange.location != NSNotFound) 
    // the string is valid 
else 
    // the string is invalid 

匹配:

5:12 
5:1 
5:01 
5:0 
5:00 
1234567:12 
0:0 
5.1 
5.0 
0.1 
0.0 
1234567.1 

不匹配:

5  // symbol required (i.e. ":" or ".") 
5: // minutes are required 
5:123 // too many minutes, max is 2 digits 
5:67 // minutes can only be up to 59 
-5:12 // negative numbers aren't allowed 
5. // minutes are required 
5.12 // too many minutes, max is 1 digit 
:12 // hours are required 
.12 // hours are required 
5.1a // string must not contain "a" 
5.1 // string must not contain whitespace " " 
+0

這看起來不錯,但不幸的是,它的iPhone 3.1.3 – 2010-04-24 21:28:41

1

由於我使用的是3.1.3,我沒有在文檔中快速搜索字符串使用正則表達式我想到了這一點,我只是複製了文檔中的內容,但添加了eagles正則表達式,但我添加了一個\\,因爲它們在文檔中所做的工作似乎有效,但由於我對正則表達式不瞭解ssions我不知道如果這是正確的,如果它應該工作,請指教(在同時,我將開始在正則表達式閱讀起來):

NSArray *array = [NSArray arrayWithObjects: @"5:24", @"5.4", @"e3:32", @"1023:90", @"3432.2", nil]; 
NSPredicate *timePred = [NSPredicate predicateWithFormat:@"SELF MATCHES '^\\\\d+(?:[:](?:[0-5]?\\\\d)|\\\\.\\\\d)$'"]; 
NSArray *filteredArray = [array filteredArrayUsingPredicate:timePred]; 

for (NSString *oneString in filteredArray) { 
    NSLog(@"%@", oneString); 
} 
1

爲什麼不只是創建的日期格式對象,看看它會返回一個有效的NSDate

+0

保羅,感謝您的答覆,但我不認爲NSDate將接受超過23小時,如果我想把102:32。如果我錯了,請糾正我的錯誤! – 2010-04-24 22:22:36

+0

我很想說創建NSFormatter的自定義子類,但在這種情況下,我懷疑正則表達式解決方案是要走的路。 – 2010-04-24 22:49:38

+0

感謝您的建議:-) – 2010-04-24 22:50:53