格式化地址字符串

时间:2014-03-26 01:25:31

标签: objective-c nsstring string-formatting

我正在查询一个数据库,该数据库返回所有大写字母的交叉点地址。我想这样做,所以地址格式化为人们会写的。

e.g。如果它返回PINEHURST WAY NE & NE 115TH ST,则应将其格式化为Pinehurst Way NE & NE 115th St。我已尝试对capitalizedString使用NSString方法,但会将每个单词大写(例如Pinehurst Way Ne & 115Th St)。

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

有什么方法可以按照我想要的方式格式化它吗?

3 个答案:

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