2014-08-30 26 views
-1

考慮以下字符串:去除尾隨或前導字符的NSString

s1 = '0000' 
s2 = '123400' 

我將如何剝離尾隨和前導零?

在Python中我可以這樣做:

s1 = s1.lstrip('0') # 1234 
s2 = s2.rstrip('0') # 1234 
s1, s2 = s1.strip('0'), s2.strip('0') # 1234, 1234 

我會怎麼做上面給出的兩個字符串在Objective-C的等效?

回答

1

有多種可能的解決方案,下面是一個使用正則表達式。 (NSScanner將是另一種選擇)。

NSString *s1 = @"000120340"; 
NSString *t1 = [s1 stringByReplacingOccurrencesOfString:@"^0*" withString:@"" 
     options:NSRegularExpressionSearch range:NSMakeRange(0, [s1 length])]; 
NSLog(@"%@", t1); // "120340" 

NSString *s2 = @"012034000"; 
NSString *t2 = [s2 stringByReplacingOccurrencesOfString:@"0*$" withString:@"" 
     options:NSRegularExpressionSearch range:NSMakeRange(0, [s2 length])]; 
NSLog(@"%@", t2); // "012034" 

卸下零字符串的兩個兩端同時 被稱爲「微調」,可與

NSString *s3 = @"00012034000"; 
NSCharacterSet *zeroCharset = [NSCharacterSet characterSetWithCharactersInString:@"0"]; 
NSString *t3 = [s3 stringByTrimmingCharactersInSet:zeroCharset]; 
NSLog(@"%@", t3); // "12034" 
1

簡單和清晰的解決方案:

NSString *s1 = @"00"; 
    NSString *s2 = @"123400000"; 

    while ([[s1 substringToIndex:1] isEqualToString:@"0"]) 
     s1 = [s1 substringFromIndex:1]; 

    while ([[s2 substringFromIndex:[s2 length]-1] isEqualToString:@"0"]) 
     s2 = [s2 substringToIndex:[s2 length]-1]; 

    NSLog(@"s1: %@", s1); 
    NSLog(@"s2: %@", s2); 
+0

請參閱更新的問題。 – David542 2014-08-30 19:43:56

0

做有一個簡單的解決方案:數字本身沒有前導零(但是由於尾隨),所以爲了得到前導零,我們只需要將它們轉換爲數字對象,然後返回到字符串。這將刪除它們。但是這對於尾隨零不起作用。

NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; 
NSString *leftStripped = [f stringFromNumber:[f numberFromString:self]]; 

但是我們可以讓它工作,我們只是扭轉串,不是創建一個數吧,創建一個字符串,並再次扭轉。

所以第一帶左零

NSString *leftStripped = [f stringFromNumber:[f numberFromString:aNumberString]]; 

比扭轉它

NSMutableString *reversedLeftStripped = [@"" mutableCopy]; 

[leftStripped enumerateSubstringsInRange:NSMakeRange(0,[leftStripped length]) 
           options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences) 
           usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
            [reversedLeftStripped appendString:substring]; 
           }]; 

創建的,一些對象,並從數

NSString *rightLeftStrippedReversed = [f stringFromNumber:[f numberFromString:reversedLeftStripped]]; 

字符串和反向它

NSMutableString *rightLeftStripped = [@"" mutableCopy]; 

[rightLeftStrippedReversed enumerateSubstringsInRange:NSMakeRange(0, [rightLeftStrippedReversed length]) options:NSStringEnumerationReverse| NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
    [rightLeftStripped appendString:substring]; 
}]; 

我會用一個類別爲:​​

@interface NSString (Stripping) 

-(NSString *)stringByStrippingLeadingAndTrailingZeros; 

@end 

@implementation NSString (Stripping) 

-(NSString *)stringByStrippingLeadingAndTrailingZeros 
{ 
    static NSNumberFormatter *f; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     f = [[NSNumberFormatter alloc] init]; 
    }); 

    NSString *leftStripped = [f stringFromNumber:[f numberFromString:self]]; 
    NSMutableString *reversedLeftStripped = [@"" mutableCopy]; 

    [leftStripped enumerateSubstringsInRange:NSMakeRange(0,[leftStripped length]) 
            options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences) 
            usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
             [reversedLeftStripped appendString:substring]; 
            }]; 

    NSString *rightLeftStrippedReversed = [f stringFromNumber:[f numberFromString:reversedLeftStripped]]; 
    NSMutableString *rightLeftStripped = [@"" mutableCopy]; 

    [rightLeftStrippedReversed enumerateSubstringsInRange:NSMakeRange(0, [rightLeftStrippedReversed length]) options:NSStringEnumerationReverse| NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) { 
     [rightLeftStripped appendString:substring]; 
    }]; 

    return rightLeftStripped; 
} 

@end 

這樣你就可以輕鬆地調用

NSString *s1 = @"00"; 
NSString *s2 = @"123400000"; 

for (NSString *string in @[s1, s2]) { 
    NSLog(@"%@", [string stringByStrippingLeadingAndTrailingZeros]); 
} 

在生產代碼中,我將創建一個輔助方法來扭轉字符串。

+0

我喜歡這個解決方案。非常酷的想法。 – Sebyddd 2014-08-31 07:29:11

+0

@Sebyddd,如果你喜歡它,不要猶豫投票。 – vikingosegundo 2014-08-31 13:45:45

相關問題