【问题标题】:Determine if NSString's first character is a number判断 NSString 的第一个字符是否为数字
【发布时间】:2011-03-05 18:17:01
【问题描述】:

我只是想知道如何确定 NSStrings 的第一个字符是否为数字。

【问题讨论】:

    标签: iphone objective-c xcode nsstring numbers


    【解决方案1】:
    BOOL hasLeadingNumberInString(NSString* s) {
    if (s)
        return [s length] && isnumber([s characterAtIndex:0]);
    else
        return NO;
    

    }

    如果您同时处理多个 NSString(例如循环遍历数组)并且您想检查每个 NSString 的格式(如前导数字),最好包含检查,这样您就不会尝试评估空的或不存在的字符串。

    例子:

    NSString* s = nil; //Edit: s needs to be initialized, at the very least, to nil.
    hasLeadingNumberInString(s);          //returns NO
    hasLeadingNumberInString(@"");        //returns NO
    hasLeadingNumberInString(@"0123abc"); //returns YES
    

    【讨论】:

    • 我喜欢这个。当出现意外的 nil 或零长度字符串时,许多应用程序会崩溃。开发人员绝不会尝试将字段留空或其他奇怪的事情。
    • NSString* s; hasLeadingNumberInString(s); //返回 NO 不起作用,因为 s 是一个随机数,而不是 nil。 (次要的方法是对的,只需使用 NSString* s = nil; 进行测试。
    • 汤姆是正确的。我的方法假设 s 至少初始化为 nil 或其他值。
    【解决方案2】:

    是的。你可以这样做:

    NSString *s = ...; // a string
    unichar c = [s characterAtIndex:0];
    if (c >= '0' && c <= '9') {
        // you have a number!
    }
    

    【讨论】:

    • 甚至是isdigit([s characterAtIndex:0])?
    【解决方案3】:

    我可以想到两种方法。你可以使用

    [string rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location == 0
    

    或者你可以使用

    [[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]
    

    【讨论】:

    • 我不会使用其中任何一个。他们扫描字符串 o(N)。如果您只关心第一个字符,则应使用 o(1) 解决方案。
    • 第二个不扫描字符串。根据 NSCharacterSet 的实现方式,它可能会扫描集合,也可能是一个测试,就像您在下面的答案一样。
    • 也可能是 decimalDigitCharacterSet 抛出一个分配的自动释放对象,当多次调用时会影响性能。
    【解决方案4】:

    检查返回值:

    [myString rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]];
    

    如果返回范围的location 值为0,则第一个字符匹配。

    【讨论】:

    • 这对于长字符串可能真的很慢,如果用户输入字符串,它可以是任意长度。 (见订单(N)评论)
    • 您是否真的检查过该方法是否扫描了整个字符串?如果这样做了,那将是非常糟糕的实施。从文档中:“查找并返回给定字符集中第一个字符的接收器范围。”在我看来,一旦找到匹配项,它就会停止。
    • 再想一想,我上面说的至少在第一个字符有正匹配的情况下应该是正确的。如果没有,字符串确实会被完全解析(最坏的情况是整个字符串都没有匹配)。
    【解决方案5】:

    而不是使用扫描整个字符串的调用,最好将第一个字符拉出来然后看看它是什么:

    char test = [myString characterAtIndex:0];
    if (test >= '0' && test <= '9')
      return YES
    else
      return NO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-31
      • 1970-01-01
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多