Improved componentsJoinedByString:
Comments available as RSS 2.0
To format list of categories, ingredients etc in a more readable way for ChickenPing, I use a function which joins a list of strings using a separator and a final separator. Eg:
NSArray *items = [[NSArray alloc] initWithObjects:@"Item1", @"Item2", @"Item3", nil]; NSString *joined = [Utils implode:items withSeperator:@", " trimStrings:true lastSeparator:@" and "]; // returns "Item1, Item2 and Item3"
It’s more flexible than NSArraycomponentsJoinedByString: because it includes an optional last separator and the option to trim strings. Code is below.
/// <summary> /// Joins a list using a separator. /// </summary> /// <param name="items">The list to join.</param> /// <param name="separator">The separator to use.</param> /// <param name="trim">If set to <c>true</c>, trims whitespace from each index.</param> /// <returns>A string containing the values separated by the separator</returns> +(NSString*)implode:(NSArray*)items withSeperator:(NSString*)separator trimStrings:(bool)trim { return [Utils implode:items withSeperator:separator trimStrings:trim lastSeparator:separator]; } /* <summary> * Joins a list using a separator. * </summary> * <param name="items">The list to join.</param> * <param name="separator">The separator to use.</param> * <param name="trim">If set to <c>true</c>, trims whitespace from each index.</param> * <param name="lastSeparator">The separator to use to join the second to last and last item, or <c>null</c> to use the separator. Eg: Could be "and".</param> * <returns>A string containing the values separated by the separator</returns> */ +(NSString*)implode:(NSArray*)items withSeperator:(NSString*)separator trimStrings:(bool)trim lastSeparator:(NSString*)separatorForLastItem { NSMutableString *buffer = [[NSMutableString alloc] init]; int num = [items count], added = 0; for (NSString *item in items) { [buffer appendString:trim ? [item stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] : item]; if (added + 1 < num) { if (added == num - 2 && separatorForLastItem != nil) { [buffer appendString:separatorForLastItem]; } else { [buffer appendString:separator]; } } added++; } return [buffer copy]; }


Comments
Leave a Comment