考慮以下字符串:去除尾隨或前導字符的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的等效?
考慮以下字符串:去除尾隨或前導字符的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的等效?
有多種可能的解決方案,下面是一個使用正則表達式。 (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"
簡單和清晰的解決方案:
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);
做有一個簡單的解決方案:數字本身沒有前導零(但是由於尾隨),所以爲了得到前導零,我們只需要將它們轉換爲數字對象,然後返回到字符串。這將刪除它們。但是這對於尾隨零不起作用。
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]);
}
在生產代碼中,我將創建一個輔助方法來扭轉字符串。
我喜歡這個解決方案。非常酷的想法。 – Sebyddd 2014-08-31 07:29:11
@Sebyddd,如果你喜歡它,不要猶豫投票。 – vikingosegundo 2014-08-31 13:45:45
請參閱更新的問題。 – David542 2014-08-30 19:43:56