我正在查询一个数据库,它返回所有大写的交叉地址。我想让地址的格式和书写的一样
。如果返回PINEHURST WAY NE & NE 115TH ST
,则应将其格式化为Pinehurst Way NE & NE 115th St
。我试过使用capitalizedString
方法的NSString
,但大写每个单词(例如Pinehurst Way Ne & 115Th St
)。
adStr = [adStr capitalizedString];
有什么办法可以按我想要的方式格式化它吗?
没有内置的NSString capitalizeAsOneWouldWriteAnAddress
方法可以神奇地理解您试图实现的方式中地址单词大写的逻辑。因此,您必须手动实现它。例如,您必须查找罗盘方向,如"NE"one_answers"SW",并将它们全部大写(或保持大写)。你必须寻找诸如"115"之类的序数(基本上,任何以数字开头的单词- nsregulareexpression在这里会派上用场),并确保字母是小写的。
您可能想要查看NSLinguisticTagger,看看它是否可以帮助您有意义地标记地址片段,但我怀疑它可以。
你可以试试这样做。
adStr = [adStr capitalizedString];
if ([string rangeOfString:@" Ne "].location != NSNotFound) {
adStr = [adStr stringByReplacingOccurrencesOfString:@" Ne " withString:@" NE "];
}
尝试将NE, SE, SW等放入数组中,并将if语句嵌套在循环中。
我使用的方法是:
-(NSString *)formattedAdd:(NSString *)address {
//Start with fresh capitalized string.
address = [address capitalizedString];
//Format directions properly.
NSArray *directions = @[@"Ne", @"Se", @"Sw", @"Nw"];
for (NSString *direc in directions) {
if ([address rangeOfString:direc options:NSCaseInsensitiveSearch].location != NSNotFound) {
address = [address stringByReplacingOccurrencesOfString:direc withString:[direc uppercaseString]];
}
}
//Create regexes for street and numerical street names
NSRegularExpressionOptions regexOptions = NSRegularExpressionCaseInsensitive;
NSString *pattern = @"[0-9]\w+";
NSString *patterntwo = @"\s(?:St|Ave|Pl)";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:regexOptions error:nil];
NSRegularExpression *regextwo = [NSRegularExpression regularExpressionWithPattern:patterntwo options:regexOptions error:nil];
//Fix numerical street names.
NSArray *matches = [regex matchesInString:address options:0 range:NSMakeRange(0, address.length)];
for (NSTextCheckingResult *re in matches) {
NSString *numSt = [address substringWithRange:re.range];
address = [address stringByReplacingCharactersInRange:re.range withString:[numSt lowercaseString]];
}
//Fix "St" with "St., Ave with Ave., etc."
NSArray *matchestwo = [regextwo matchesInString:address options:0 range:NSMakeRange(0, address.length)];
NSMutableString *adMut = [address mutableCopy];
int count = 0;
for (NSTextCheckingResult *re in matchestwo) {
int index = (int)re.range.location + (int)re.range.length;
[adMut insertString:@"." atIndex:index + (count == 1 ? 1:0];
count++;
}
address = [adMut copy];
return address;
}