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方法来反转字符串