我在 NSString 中有一些数据,用冒号分隔:
@"John:Doe:1970:Male:Dodge:Durango"
我需要将此字符串的总长度限制为 100 个字符。但我还需要确保存在正确数量的冒号。
截断字符串但还要添加额外的冒号以便我可以将其解析为另一侧正确数量的字段的合理方法是什么?
例如,如果我的限制是 18,你最终会得到这样的结果:
@"John:Doe:1970:Ma::"
这是我自己的最新通行证的更新版本。使用@blinkenlights 算法:
+ (NSUInteger)occurrencesOfSubstring:(NSString *)substring inString:(NSString *)string {
// http://stackoverflow.com/a/5310084/878969
return [string length] - [[string stringByReplacingOccurrencesOfString:substring withString:@""] length] / [substring length];
}
+ (NSString *)truncateString:(NSString *)string toLength:(NSUInteger)length butKeepDelmiter:(NSString *)delimiter {
if (string.length <= length)
return string;
NSAssert(delimiter.length == 1, @"Expected delimiter to be a string containing a single character");
int numDelimitersInOriginal = [[self class] occurrencesOfSubstring:delimiter inString:string];
NSMutableString *truncatedString = [[string substringToIndex:length] mutableCopy];
int numDelimitersInTruncated = [[self class] occurrencesOfSubstring:delimiter inString:truncatedString];
int numDelimitersToAdd = numDelimitersInOriginal - numDelimitersInTruncated;
int index = length - 1;
while (numDelimitersToAdd > 0) { // edge case not handled here
NSRange nextRange = NSMakeRange(index, 1);
index -= 1;
NSString *rangeSubstring = [truncatedString substringWithRange:nextRange];
if ([rangeSubstring isEqualToString:delimiter])
continue;
[truncatedString replaceCharactersInRange:nextRange withString:delimiter];
numDelimitersToAdd -= 1;
}
return truncatedString;
}
请注意,我认为此解决方案无法处理 CRD 中分隔符数量小于限制的边缘情况。
我需要正确数量的冒号的原因是服务器上的代码将拆分为冒号并期望得到 5 个字符串。
您可以假设冒号分隔字符串的组件本身不包含冒号。