Objective c 剥离NSString中的尾随字符或前导字符

Objective c 剥离NSString中的尾随字符或前导字符,objective-c,Objective C,给定以下字符串: s1 = '000001234' 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中执行等效操作?更简单、更干净的解决方案: NSString *s1 = @"

给定以下字符串:

s1 = '000001234'
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中执行等效操作?

更简单、更干净的解决方案:

    NSString *s1 = @"0001234";
    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);

有各种可能的解决方案,这里有一个使用正则表达式。 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"

有一个简单的解决方案:数字本身并没有前导零,而是有原因的尾随,所以要得到前导零,我们只需要将它们转换为数字对象,然后再转换回字符串。这将删除它们。但这不适用于尾随的零

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];
                              }];
NSMutableString *rightLeftStripped = [@"" mutableCopy];

[rightLeftStrippedReversed enumerateSubstringsInRange:NSMakeRange(0, [rightLeftStrippedReversed length]) options:NSStringEnumerationReverse| NSStringEnumerationByComposedCharacterSequences usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
    [rightLeftStripped appendString:substring];
}];
创建该对象的数字对象和该数字的字符串

NSString *rightLeftStrippedReversed = [f stringFromNumber:[f numberFromString:reversedLeftStripped]];
把它倒过来

NSMutableString *reversedLeftStripped = [@"" mutableCopy];

[leftStripped enumerateSubstringsInRange:NSMakeRange(0,[leftStripped length])
                                 options:(NSStringEnumerationReverse | NSStringEnumerationByComposedCharacterSequences)
                              usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
                                  [reversedLeftStripped appendString:substring];
                              }];
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 = @"0001234";
NSString *s2 = @"123400000";

for (NSString *string in @[s1, s2]) {
    NSLog(@"%@", [string stringByStrippingLeadingAndTrailingZeros]);
}
在生产代码中,我将创建一个helper方法来反转字符串