我正在查询一个数据库,该数据库返回所有大写字母的交叉点地址。我想这样做,所以地址格式化为人们会写的。
e.g。如果它返回PINEHURST WAY NE & NE 115TH ST
,则应将其格式化为Pinehurst Way NE & NE 115th St
。我已尝试对capitalizedString
使用NSString
方法,但会将每个单词大写(例如Pinehurst Way Ne & 115Th St
)。
这是我的代码:
adStr = [adStr capitalizedString];
有什么方法可以按照我想要的方式格式化它吗?
答案 0 :(得分:2)
没有内置的NSString capitalizeAsOneWouldWriteAnAddress
方法可以神奇地理解以你想要实现的方式大写地址字的逻辑。因此,您必须手动完成它。例如,您必须查找指南针方向,例如“NE”和“SW”,并使它们(或保留它们)全部大写。你必须寻找诸如“115th”之类的序数(基本上,任何以数字开头的单词 - NSRegularExpression在这里会派上用场)并确保字母是小写的。
您可能需要查看NSLinguisticTagger以了解它是否可以帮助您有意义地标记地址片段,但我怀疑它可以。
答案 1 :(得分:0)
你可以尝试这样的事情。
adStr = [adStr capitalizedString];
if ([string rangeOfString:@" Ne "].location != NSNotFound) {
adStr = [adStr stringByReplacingOccurrencesOfString:@" Ne " withString:@" NE "];
}
尝试将NE,SE,SW等放入数组中,并将if语句嵌套在循环中。
答案 2 :(得分:0)
这是我使用的方法:
-(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;
}