Iphone 如何根据需要格式化字符串

Iphone 如何根据需要格式化字符串,iphone,ios,nsstring,Iphone,Ios,Nsstring,我有三种类型的字符串,我想格式化该字符串以获得街道编号、街道名称和城市名称 The first type is : 34 Ellis Street, San Francisco Here i want to make it like street number : 34 street name : Ellis Street city name : San Francisco The second type is : 4FL, 800 Market Street, San Francisco

我有三种类型的字符串,我想格式化该字符串以获得街道编号、街道名称和城市名称

The first type is : 34 Ellis Street, San Francisco
Here i want to make it like 
street number : 34
street name : Ellis Street
city name : San Francisco


The second type is : 4FL, 800 Market Street, San Francisco
Here i want to delete 4FL, 
And i want to make it like 
street number : 800
street name : Market Street
city name : San Francisco

The third type is : Ellis & Market, San Francisco
Here i want to make it like 
street number : 
street name : Ellis & Market
city name : San Francisco

我如何才能做到这一点或任何显示字符串格式的链接,而不是请建议的那样。是的,我在这里写的字符串只是我得到的字符串的一种格式,字符串每次都会更改。

可能是第一个可以实现将地址字符串分解为不同变量的代码,例如
\u streetNum,\u streetName,_cityName
然后可以使用以下代码行格式化字符串

NSString* formattedString = [[NSString alloc] initWithFormat:@"street number : %@\nstreet name :%@\ncity name :%@",_streetNum,_streetName,_cityName];
试试这个:

NSArray *array = [yourString componentsSeparatedByString:@" "];

它将为您提供一个数组wsth,其中所有字符串由“”分隔

尝试以下方法并解析与该地址相关的响应

http://maps.googleapis.com/maps/api/geocode/json?address=34%20Ellis%20Street,%20San%20Francisco,+CA&sensor=true

希望它能帮助您。

您需要使用正则表达式。看看这个:

1)用以下内容分开:

NSArray *arrayOfComponents = [yourString componentsSeparatedByString:@","];
NSString *addressString;
NSArray *tempArray = [addressString componentsSeparatedByString:@", "];
if([tempArray count]==3){
    city = [tempArray objectAtIndex:2];
    NSString *tempString = [tempArray objectAtIndex:1];

    NSArray *temp1Array = [tempString componentsSeparatedByString:@" "];
    if ([temp1Array count]>1) {
        st_num = [tempArray objectAtIndex:0];
        st_name = [tempString stringByReplacingOccurrencesOfString:
                             [NSString stringWithFormat:@"%@ ",st_num] withString:@""];
    }
}
2) 最后一个组件将始终是您的城市名称

3) 然后用以下命令检查(最后一个-1)组件:

NSArray *array = [yourString componentsSeparatedByString:@" "];
2) 取数组的第一个元素并使用

NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
    // newString consists only of the digits 0 through 9
}
3) 如果它只有数字,那么第一个元素是你的街道号,只需通过附加其余元素来生成一个新字符串,以获得街道名称。否则,上一个数组中的过去(last-1)就是街道名称

这是基本思想,逻辑显然可以改进。


编辑:因为您提到这个字符串是由GoogleAPI提供的,这意味着您可能会得到一个JSON响应。您应该使用完整的JSON响应来填充文本字段。您可以使用一个JSON-to-NSDictionary类:请参见

将地址字符串传递给此方法,然后将其转换为包含streetNumber、streetName和cityName的3个字符串对象的数组。然后将数组返回给调用方

-(NSArray *)brakeAddress:(NSString *)address{

     NSMutableArray *arr=[NSMutableArray arrayWithArray:[address componentsSeparatedByString:@","]];

     if (arr.count>2) {
     [arr removeObjectAtIndex:0];
     }

     NSInteger streetNameInd=[arr count]-2, cityNameInd=[arr count]-1;

     NSMutableArray *streetNameArray=[NSMutableArray arrayWithObjects:arr[0], nil];

     if ([arr[streetNameInd] intValue]) {

     streetNameArray=[NSMutableArray arrayWithArray:([arr[streetNameInd] componentsSeparatedByString:@" "])];

     [streetNameArray removeObjectAtIndex:0];
     if ([streetNameArray[0] intValue] ==[arr[streetNameInd] intValue]) {
     [streetNameArray removeObjectAtIndex:0];
     }
     }

     NSString *streetName=[streetNameArray componentsJoinedByString:@" "];

     NSString *streetNumber=@"";
     if ([arr[streetNameInd] intValue]!=0) {
     streetNumber=[NSString stringWithFormat:@"%d", [arr[streetNameInd] intValue]];
     }

    NSString *city=arr[cityNameInd];
    // NSLog(@"\nstreet number :%@\nstreet name  :%@\ncity name :%@",streetNumber, streetName,city);

    NSArray *addressParts=[NSArray arrayWithObjects:streetNumber, streetName, city, nil];

    return addressParts;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification{

    NSString *str1=@"34 Ellis Street, San Francisco";
    NSString *str2=@"4FL, 800 Market Street, San Francisco";
    NSString *str3=@"Ellis & Market, San Francisco";

    NSArray *firstAddress=[self brakeAddress:str1];
    NSArray *secondAddress=[self brakeAddress:str2];
    NSArray *thirdAddress=[self brakeAddress:str3];

    NSLog(@"\n1st : street number :%@\nstreet name  :%@\ncity name :%@",firstAddress[0],firstAddress[1],firstAddress[2]);
    NSLog(@"\n2nd : street number :%@\nstreet name  :%@\ncity name :%@",secondAddress[0],secondAddress[1],secondAddress[2]);
    NSLog(@"\n3rd : street number :%@\nstreet name  :%@\ncity name :%@",thirdAddress[0],thirdAddress[1],thirdAddress[2]);


}

下面是一段可能对您有所帮助的代码

NSString *addressString;
NSArray *tempArray = [addressString componentsSeparatedByString:@", "];
if([tempArray count]==3){
    city = [tempArray objectAtIndex:2];
    NSString *tempString = [tempArray objectAtIndex:1];

    NSArray *temp1Array = [tempString componentsSeparatedByString:@" "];
    if ([temp1Array count]>1) {
        st_num = [tempArray objectAtIndex:0];
        st_name = [tempString stringByReplacingOccurrencesOfString:
                             [NSString stringWithFormat:@"%@ ",st_num] withString:@""];
    }
}

您可以根据您的需求扩展它的逻辑。

如果它是唯一的格式,我们可以整理一些逻辑并实现它,但是每次它都会给出一些不正确的文本,我们需要静态地做这类事情。如果是固定格式,我们可以修复。抱歉@Madhu此字符串由google api返回,我必须在三个不同的文本视图中将此字符串显示为字符串中的文本。您可以使用:[yourstring substringFromIndex:0];[yourstring子字符串到索引:1];但这就是问题所在,我如何打破这个字符串,它给了我三种类型的字符串。它给出了错误,比如“下标要求接口'NSMutableArray'的大小,在非脆弱ABI中不是常数”。我在mac os x应用程序中使用上述代码,启用了ARC并且没有警告没有错误,这就是为什么我发布了…replace everywhere
arr[index]
[arr objectAtIndex:index]
并尝试重新编码thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx,thanx..+1对于要转换的属性,您需要指定一次(再次查看我编辑的代码,因为我传递了一个长字符串并将其分解为数组),然后我通过将其附加到字符串来再次记录它。