2014-03-26 86 views
1

我在查询一个数据库,它返回全部大写的交集地址。我想这样做,地址被格式化为一个人可以写的地址。正确格式化地址字符串

例如如果返回PINEHURST WAY NE & NE 115TH ST,则应将其格式设置为Pinehurst Way NE & NE 115th St。我试过对NSString使用capitalizedString方法,但是每个单词都大写(例如Pinehurst Way Ne & 115Th St)。

这里是我的代码: adStr = [adStr capitalizedString];

有什么办法,我可以格式化它,我希望它的方式?

+0

显示您的代码,请 – Baahubali

+0

@ user1490835我编辑我的职务。 – Milo

回答

2

没有内置的NSString capitalizeAsOneWouldWriteAnAddress方法,它可以神奇地理解以您尝试实现的方式来大写地址单词的逻辑。因此您必须手动完成。例如,你将不得不寻找诸如“NE”和“SW”之类的指南针方向,并使它们(或保留它们)全部大写。你将不得不寻找诸如“115th”之类的序号(基本上,任何以数字开头的单词--NSRegularExpression将在这里派上用场),并确保这些字母是小写字母。

你可能想看看NSLinguisticTagger看它是否可以帮助你有意义地标记地址的片断,但我怀疑它可以。

+0

我知道没有办法。这就是我问这个问题的原因。 – Milo

+0

那么恐怕我不明白什么是问题_is_。我确实描述了你将不得不做的事情。有什么麻烦?你没有找到关于如何搜索字符串的方法的文档? – matt

+0

我只是在你的回答开始时评论你的评论。我只是觉得没有必要。 – Milo

0

你可以尝试这样的事情。

adStr = [adStr capitalizedString]; 

if ([string rangeOfString:@" Ne "].location != NSNotFound) { 
    adStr = [adStr stringByReplacingOccurrencesOfString:@" Ne " withString:@" NE "]; 
} 

尝试将NE,SE,SW等放入数组中,并将if语句嵌套在循环中。

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; 
}