24小时到12小时转换,将字符插入字符串

时间:2010-07-10 07:55:05

标签: objective-c regex cocoa string nsstring

这是我的问题here的次要问题,但有人建议将问题分开以便做出更好的回应。

我有单独的数据行,如下所示,分别传递给函数。

Mon-Wed 930-1700 Thu 900-1700 Fri 930-1700  
Mon-Wed 930-1700 Thu 900-1700 Fri 930-1700 Sat 900-1200, Home Lending Sat 900-1600  
Mon-Thu 900-1600, Fri 900-1700  

需要它阅读如下:

Mon-Wed 9:30am-5:00pm;Thu 9:00am-5:00pm;Fri 9:30am-5:00pm;Sat 9:00am-12:00pm, Home Lending Sat 9:00am-4:00pm

我需要将时间转换为12小时而不是像

那样相对容易
if (time > 1200) {  
    time = time - 1200
    //add the pm and the colon :
} else {
   //add the am and the colon :
}

我的问题是,我该如何:
- 首先寻找数字 - 将它们拉出并转换为int来执行计算(我认为使用intValue) - 进行计算并将它们插回到字符串的相同位置,包括am / pm和冒号。

我一直在使用RegexKitLite的正则表达式,但我怎么记得将它插回到字符串中的位置,以及如何从字符串中删除已经存在的内容来替换它?例如1700.我假设使用MutableStrings但需要一些帮助。

以下是我一直在研究的一些代码,但如果有一个更简单的解决方案意味着将其丢掉,我不介意......

NSString *regexString = @"(\\s|-?)(\\d{3,4})(;?|\\s?|-?)";

NSRange matchedRange = NSMakeRange(NSNotFound,NSNotFound);

//loop while we haven't fixed all times in the string
while (!matchedRange.length == 0) {

    matchedRange = [openingHoursString rangeOfRegex:regexString capture: 2];

    if (!matchedRange.length == 0) {

        NSString *digits = [openingHoursStrinig substringWithRange: matchedRange];
        NSLog(@"digits string: %@", digits);

        //do calculations and add colon to digits string and reinsert to openingHoursString
    }
}

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

这是一个未经测试的想法:

NSString *regexString = @"\\d+|\\D+";
NSMutableString* result = [NSMutableString string];
for(NSString *match in [openingHoursString componentsMatchedByRegex:regexString])
{
    if ([[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[match characterAtIndex:0]]) {
        int t = [match intValue];
        BOOL pm = t >= 1200;
        if (t >= 1300)
            t -= 1200;
        [result appendFormat:@"%d:%02d%s", t / 100, t % 100, pm ? "pm" : "am"];
    } else {
        [result appendString:match];
    }
}