2014-08-30 4 views
-1

Учитывая следующие строки:Зачистка завершающую или ведущие символы в NSString

s1 = '0000' 
s2 = '123400' 

Как бы я скину буксировку и ведущие нули?

В питоне я могу сделать:

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

Simpler и чистое решение:

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

0

Существует простое решение: Числа сами не имеют ведущие нули (но для причины trailing), поэтому для получения начальных нулей нам просто нужно преобразовать их в числовые объекты, а затем вернуться к строкам. Это удалит их. Но это не работает для конечных нулей.

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

+0

@Sebyddd, не стесняйтесь голосовать, если вам это нравится. – vikingosegundo

Смежные вопросы