2014-03-26 85 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; 
}