目标C语言 正确格式化地址字符串



我正在查询一个数据库,它返回所有大写的交叉地址。我想让地址的格式和书写的一样

。如果返回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;
}

最新更新