【问题标题】:Convert HH:MM NSString to NSInteger with minutes用分钟将 HH:MM NSString 转换为 NSInteger
【发布时间】:2012-11-28 21:14:10
【问题描述】:

我有几个 NSStrings 包含持续时间,它们看起来像这样:@"03:40", @"08:40" - 时间是动作的持续时间。 我想为每个带有分钟的字符串设置一个int,比如“01:20”是“80”(分钟),以便稍后将它们相互比较。

您如何在 Objective-C 中管理这个简单的事情? 提前致谢

编辑:

试过了,没用。我想要一种完全不同的方法,简单而轻松。

- (NSMutableArray *)sortResultsByTime
{
    NSMutableArray *sortedTrips = [NSMutableArray arrayWithArray:[_tweets sortedArrayUsingComparator: ^(id trip1, id trip2) {

        double time1 = [self durationFromString:[(Tweet *) trip1 flightDuration]];
        double time2 = [self durationFromString:[(Tweet *) trip1 flightDuration]];
        NSLog(@"What's time1? It's %f", time1);
        NSLog(@"What's time2? It's %f", time2);

        if (time1 < time2) {
            return (NSComparisonResult)NSOrderedDescending;
        }

        if (time1 > time2) {
            return (NSComparisonResult)NSOrderedAscending;
        }

        return (NSComparisonResult)NSOrderedSame;
    }]];

    return sortedTrips;
}

- (double)durationFromString:(NSString *)durationString
{
    NSArray *durationArray = [durationString componentsSeparatedByString:@":"];

    return [durationArray[0] doubleValue] + [durationArray[1] doubleValue] / 60.0;
}

【问题讨论】:

  • @H2CO3 回答了您的问题。答案也与我的问题无关,我需要一种不同的方法
  • 为什么需要转换为整数才能进行比较?如果你的字符串有前导零,你可以使用它们。
  • 另外,为什么所有多余的演员表?

标签: iphone objective-c ios cocoa-touch nsdate


【解决方案1】:

您发布的代码试图将字符串转换为小时数,而不是分钟数。

你想要:

return [durationArray[0] doubleValue] * 60 + [durationArray[1] doubleValue];

编辑:原始代码失败,因为这一行:

double time2 = [self durationFromString:[(Tweet *) trip1 flightDuration]];

需要:

double time2 = [self durationFromString:[(Tweet *) trip2 flightDuration]];

更新:既然 OP 想要一种不同的方法,为什么不简单地这样做:

NSString *time1 = [(Tweet *) trip1 flightDuration];
NSString *time2 = [(Tweet *) trip2 flightDuration];

return [time1 compare:time2];

【讨论】:

  • 非常感谢,但我想要一种不同的方法。带有 doubleValue 的东西对我来说不太适用。
  • 对不起,我不明白你的意思。究竟是什么不工作?
  • 转换成双倍和所有这些东西。我想从小时数中获得几分钟内的原始数据。没有新的数组和过于复杂的技术。
  • 您还希望如何将时间字符串转换为分钟数而无需解析字符串?顺便说一句 - 请参阅我更新的答案。您的代码中有一个小错误导致问题。
  • 添加原始时间字符串的日志,以便您确定要转换的内容。
【解决方案2】:

由: 分割(使用-[NSString componentsSeparatedByString:]),访问每个元素(使用-[NSArray objectAtIndex:),然后转换为整数(-[NSString intValue]),最后乘加。

【讨论】:

  • 这不是已经在做的事情(除了使用双精度而不是整数)吗?
  • 当然是。我在你之前回答过,我参考了他的代码。
  • 这对你来说似乎很重要,所以我会解释它。当我开始回答时,问题中没有任何代码。查看问题的日期和时间(已编辑)和我的答案有 2 分钟的差距或类似的东西。我想我在真正点击“发布”之前分心了 2 分钟,同时添加了代码。我是否错过了有关正在更新的问题的警告?听起来很有道理。我不记得你看过我的肩膀所以不要无缘无故地称我为骗子。
【解决方案3】:

我不明白您为什么认为其他答案过于复杂,但如果您想要一个没有数组的解决方案,您可以在这里:

- (double)durationFromString:(NSString *)s
{
    int hr = 0, min = 0;
    NSScanner *scn = [NSScanner scannerWithString:s];
    [scn scanInt:&hr];
    [scn scanString:@":" intoString:NULL];
    [scn scanInt:&min];
    return hr * 60 + min;
}

【讨论】:

    猜你喜欢
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-04
    • 2015-05-30
    • 2020-05-11
    • 1970-01-01
    相关资源
    最近更新 更多