2012-11-28 3 views
4

В моем проекте я использовал NSDateFormatter для правильного форматирования дат, отображаемых в приложении. Если быть более конкретным, вот пример:iOS: форматирование и локализация таймеров/счетчиков времени

English: 12:34 am 
Arabic: ١٢:٣٤ ص 

Отлично выглядит, показывает цифры, которые мне нужны. Тем не менее, у меня есть счетчик времени/таймер, который подсчитывать вверх/вниз в приложении:

01:31:22 // HH:mm:ss 

Как бы я правильно локализовать этот счетчик, который будет отображаться как:

٠١:٣١:٢٢ 

Я проверил NSDateFormatter, но насколько я вижу, это не представляет конкретного случая использования. NSNumberFormatter, похоже, работает для валют и процентов.


Почему NSDateFormatter не имеет смысла:

Потому что она имеет свойство NSTimeZone и имеет суффикс am/pm совмещающее бесполезны, когда мы хотим использовать счетчики.

+1

'NSDateFormatter' должен представлять этот конкретный случай использования, это представление некоторой формы даты. Как это не работает для вас? – WDUK

+0

@WDUK У меня есть переменная, содержащая количество секунд, и я должен превратить ее в 'HH: mm: ss'. Чтобы использовать 'NSDateFormatter', мне нужно преобразовать секунды, которые у меня есть в' NSDate', но для меня это не имеет смысла. (Надеюсь, у меня есть смысл). – Mazyod

+0

Имеет смысл, вы хотите отформатировать интервал дат. Правильно, все будет не так просто. Похоже, что вы ** можете ** (еще не можете подтвердить) нуждаются в пользовательском форматировании для достижения эффекта, которым вы пользуетесь. Я посмотрю через несколько часов, но пока вижу https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/DataFormatting/Articles/CreatingACustomFormatter.html#//apple_ref/doc/uid/20000196-CJBFABHB – WDUK

ответ

2

В таком случае, я думаю, у меня есть что-то для вас. Я создал базовый подкласс NSFormatter, который поможет вам. Все, что вам нужно сделать, это предоставить его NSNumber, который содержит NSTimeInterval.

заголовочных и .m доступны здесь: https://github.com/WDUK/WDCountdownFormatter

А вот несколько примеров кода, используя его, и да, он должен уважать локали.

WDCountdownFormatter* format = [[WDCountdownFormatter alloc] init]; 
NSLog(@"70 - %@",[format stringForObjectValue:@(70)]); 
NSLog(@"179 - %@",[format stringForObjectValue:@(179)]); 
NSLog(@"-10 - %@",[format stringForObjectValue:@(-10)]); // Invalid, will return nil 
NSLog(@"0 - %@",[format stringForObjectValue:@(0)]); 
NSLog(@"9827193 - %@",[format stringForObjectValue:@(9827193)]); 
NSLog(@"1 - %@",[format stringForObjectValue:@(1)]); 

Производит

// UK English 
2012-11-28 23:11:11.453 StackOverflow[28687:c07] 70 - 00:01:10 
2012-11-28 23:11:11.456 StackOverflow[28687:c07] 179 - 00:02:59 
2012-11-28 23:11:11.457 StackOverflow[28687:c07] -10 - (null) 
2012-11-28 23:11:11.458 StackOverflow[28687:c07] 0 - 00:00:00 
2012-11-28 23:11:11.458 StackOverflow[28687:c07] 9827193 - 2729:46:33 
2012-11-28 23:11:11.459 StackOverflow[28687:c07] 1 - 00:00:01 

// Egyptian Arabic 
2012-11-28 22:59:54.057 StackOverflow[28400:c07] 70 - ٠٠:٠١:١٠ 
2012-11-28 22:59:54.659 StackOverflow[28400:c07] 179 - ٠٠:٠٢:٥٩ 
2012-11-28 22:59:55.473 StackOverflow[28400:c07] -10 - (null) 
2012-11-28 22:59:56.464 StackOverflow[28400:c07] 0 - ٠٠:٠٠:٠٠ 
2012-11-28 22:59:57.311 StackOverflow[28400:c07] 9827193 - ٢٧٢٩:٤٦:٣٣ 
2012-11-28 23:10:36.657 StackOverflow[28400:c07] 1 - ٠٠:٠٠:٠١ 
+0

Вау, это так аккуратно. Самое лучшее в этом - это то, что вы не забыли прокладку. – Mazyod

+0

Нет проблем, следите за GitHub, я, вероятно, улучшу его в будущем (не нужно передавать NSNumber, поддержку миллисекунды, поддерживать/освобождать поддержку [для этого вам нужен ARC в данный момент] и т. Д. .).Рад помочь :) – WDUK

+0

вы можете изменить форматтер в WDCountDownFormatter, чтобы напечатать число в арабском или персидском языке: [formatter setLocale: [[NSLocale alloc] initWithLocaleIdentifier: @ "per"]]; –

Смежные вопросы