Элементы форматирования в Mac OS X, iOS

Введение

Вы можете использовать элементы форматирования, чтобы интерпретировать и создавать строки, которые представляют другие типы данных, а также для проверки текста в текстовых полях и других cell элементах. Элементы форматирования являются экземплярами подкласса абстрактного класса, NSFormatter. Foundation framework предоставляет два конкретных подкласса NSFormatter: NSNumberFormatter и NSDateFormatter. (Core Foundation предоставляет два эквивалентных непрозрачных типа:. CFNumberFormatter и CFDateFormatter. Они похожи, но не являются обертками для перехода к друг-другу.) Также вы можете создать подкласс NSFormatter для пользовательского форматирования.

NSDateFormatter Элементы форматирования даты (NSDateFormatter)

Есть два основных метода, которые можно использовать для создания строкового представления даты и разбора строки, чтобы получить дату объекта с помощью дата-форматирования dateFromString: и stringFromDate: соответственно. Вы также можете использовать getObjectValue:forString:range:error: если вам необходим больший контроль над диапазоном строки, которую вы хотите анализировать.

Есть много атрибутов, которые можно получать и устанавливать для элемента форматирования даты. Когда вы представляете информацию пользователю, обычно следует просто использовать константы стиля NSDateFormatter, чтобы указать предопределенные наборы атрибутов, которые определяют, как отформатировать дату. Если вам нужно создать представление даты в точном формате, вы должны использовать строку формата.

Если вам нужно разобрать строку, содержащую дату, подход, который вы принимаете опять же зависит от того, чего вы хотите достичь. Если вы хотите разобрать входные данные от пользователя, обычно следует использовать константы стиля так, чтобы соответствовать их ожиданиям. Если вы хотите разобрать даты, которые вы получаете из базы данных или веб-сервиса, например, вы должны использовать строку формата.

Во всех случаях следует учитывать, что элементы форматирования по умолчанию используют локаль пользователя (currentLocale), которая накладывается из предпочтений пользователя в настройках. Если вы хотите использовать локали пользователя, но без их индивидуальных настроек, вы можете получить код языка из текущей локали пользователя (localeIdentifier) и сделать новый "стандартный" язык с ней, установив стандарт языка как locale форматера.

Использование стилей для форматирования настоящей даты и времени с предпочтениями пользователя

NSDateFormatter облегчает Вам, форматирование даты с настройками пользователя настраиваемыми в языковой панели в Системных настройках. NSDateFormatter принимает константы стиля- NSDateFormatterNoStyle, NSDateFormatterShortStyle, NSDateFormatterMediumStyle, NSDateFormatterLongStyle, и NSDateFormatterFullStyle -указывающие набор атрибутов, которые определяют, как дата отображается в соответствии с предпочтениями пользователя.

Вы определяете стиль даты и времени компоненты форматирования даты независимо, используя setDateStyle: и setTimeStyle: соответственно. В листинге 1 показано, как можно форматировать дату с помощью стилей форматирования. Обратите внимание на использование NSDateFormatterNoStyle для подавления компоненты времени и выдачи строки, содержащей только дату.

Листинг 1 Форматирование даты с использованием стилей форматирования

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateStyle:NSDateFormatterMediumStyle];
[dateFormatter setTimeStyle:NSDateFormatterNoStyle];

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:162000];

NSString *formattedDateString = [dateFormatter stringFromDate:date];
NSLog(@"formattedDateString: %@", formattedDateString);
// Вывод для локали en_US: "formattedDateString: Jan 2, 2001".

Используйте строку формата для пользовательского форматирования даты

Чтобы указать пользовательский формат для фиксированного форматирования даты, можно использовать setDateFormat. Строка формата использует формат из Unicode Technical Standard #35. Версия стандарта варьируется в зависимости от выпуска операционной системы. Таблица с примерами строки формата приведена в разделе "Шаблоны формата даты"

Примечание: в Unicode формате строки формата, вы должны заключить обычный текст в строке формата между апострофами ('').

В следующем примере показано использование строки формата для создания строки:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd 'at' HH:mm"];

NSDate *date = [NSDate dateWithTimeIntervalSinceReferenceDate:162000];

NSString *formattedDateString = [dateFormatter stringFromDate:date];
NSLog(@"formattedDateString: %@", formattedDateString);
// Для US English,строка может иметь вид:
// formattedDateString: 2001-01-02 at 13:00

NSNumberFormatter Элементы форматирования чисел (NSNumberFormatter)

NSNumberFormatter предоставляет два удобных метода- stringFromNumber: и numberFromString:, которые вы можете использовать для создания строкового представления числа и создать ряд объектов из строки соответственно. Чтобы создать локализованное строковое представление числа без создания объекта форматирования, вы можете использовать метод класса: localizedStringFromNumber:numberStyle:.

Использование стилей для форматирования представлять цифры с предпочтениями пользователя

NSNumberFormatter упрощает Вам форматирование различных видов чисел с помощью настроек пользователя настраиваемых в языковой панели в Системных настройках. Константы NSNumberFormatter-NSNumberFormatterDecimalStyle, NSNumberFormatterCurrencyStyle, NSNumberFormatterPercentStyle, NSNumberFormatterScientificStyle, или NSNumberFormatterSpellOutStyle (который генерирует текстовое представление числа) -указывают набор атрибутов, которые определяют, как будет отображаться число в соответствии с предпочтениями пользователя.

Вы определяете стиль форматирования числа используя setNumberStyle:. В листинге 1 показано, как можно форматировать число с помощью стилей форматирования.

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563];
NSLog(@"formattedNumberString: %@", formattedNumberString);
// Вывод для локали en_US: "formattedNumberString: formattedNumberString: 122,344.453"

Используйте формат строк, чтобы указать пользовательские форматы

Технический стандарт для форматирования чисел приведен в Unicode Technical Standard #35.

Пример форматирования числа, используя строку формата

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"###0.##"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563];
NSLog(@"formattedNumberString: %@", formattedNumberString);

// Вывод для локали en_US: "formattedNumberString: formattedNumberString: 122,344.45"

Проценты

Если вы используете в строке формата символ "%" в формате процентов, полученные результаты могут ввести в заблуждение. Рассмотрим следующий пример:

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setPositiveFormat:@"0.00%;0.00%;-0.00%"];
NSLog(@"%@", [numberFormatter stringFromNumber:@4.0]);

// Вывод: "400.00%".

Поскольку в строке формата указано использовать проценты, NSNumberFormatter интерпретирует число четыре в виде дроби (где 1 соответствует 100%) и предоставляет его в качестве такового (4 = 4/1 = 400%).

Если Вы хотите представлять числа в виде процентов, вы должны использовать стиль NSNumberFormatterPercentStyle -это также гарантирует, что проценты отформатируются соответствующим образом для локали:

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterPercentStyle];

NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
[numberFormatter setLocale:usLocale];
NSLog(@"en_US: %@", [numberFormatter stringFromNumber:@4.0]);

// Вывод: "en_US: 400%".

NSLocale *faLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"fa_IR"];
[numberFormatter setLocale:faLocale];
NSLog(@"fa_IR: %@", [numberFormatter stringFromNumber:@4.0]);

// Вывод: "fa_IR: ‪‪٪۴۰۰‬.‬"

NSFormatter (Custom Formatter) Создание пользовательского Formatter

Вы можете создавать свои подклассы NSFormatter для форматирования представления данных, кроме дат и чисел.

Для подкласса NSFormatter, вы должны, по крайней мере, переопределить эти методы:

  • stringForObjectValue:
  • getObjectValue:forString:errorDescription:

В первом методе вы конвертируете объект ячейки в строку, а во втором методе вы преобразовываете строку в объект, связанный с ячейкой.

Пример:

Файл mbFormatterFIO.h .h

#import <Foundation/Foundation.h>

@interface mbFormatterFIO : NSFormatter

@end

Файл mbFormatterFIO.m .m

#import "mbFormatterFIO.h"

@implementation mbFormatterFIO
- (NSString *)stringForObjectValue:(id)anObject
{
  NSString* a = [[anObject stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] uppercaseString];

  if(a.length > 16)
    a = [a substringToIndex:16];
  return a;
}

- (BOOL)getObjectValue:(id *)obj forString:(NSString *)string errorDescription:(NSString  **)error
{
  if(obj)
    *obj = [NSString stringWithString: string];
  return YES;
}
@end

Данный пример иллюстрирует форматирование строки путем обрезания пробельных символов по краям строки, преобразования всех символов в заглавные и ограничением в 16 символов.

Использовать данный форматер в проекте OS X очень просто, перетащите элемент Custom Formatter в редактируемый .xib файл и в закладке Identity Inspector укажите в качестве класса mbFormatterFIO.

NSFormatter sample
 
 
homeЗаметили ошибкукарта сайта 
   Made on a Mac