Я столкнулся с несколькими петлями в реализации решения John Resig. Вот модифицированная функция, которую я использовал на основе его ответа:
function parseTime(timeString)
{
if (timeString == '') return null;
var d = new Date();
var time = timeString.match(/(\d+)(:(\d\d))?\s*(p?)/);
d.setHours( parseInt(time[1]) + ( ( parseInt(time[1]) < 12 && time[4] ) ? 12 : 0) );
d.setMinutes( parseInt(time[3]) || 0 );
d.setSeconds(0, 0);
return d;
} // parseTime()
var tests = [
'1:00 pm','1:00 p.m.','1:00 p','1:00pm','1:00p.m.','1:00p','1 pm',
'1 p.m.','1 p','1pm','1p.m.', '1p', '13:00','13', '1a', '12', '12a', '12p', '12am', '12pm', '2400am', '2400pm', '2400',
'1000', '100', '123', '2459', '2359', '2359am', '1100', '123p',
'1234', '1', '9', '99', '999', '9999', '99999', '0000', '0011', '-1', 'mioaw' ];
for ( var i = 0; i < tests.length; i++ ) {
console.log( tests[i].padStart( 9, ' ' ) + " = " + parseTime(tests[i]) );
}
В iPhone OS это немного отличается, вместо этого посмотрите NSString UIKit Additions Reference . Идея та же, что и в Cocoa для Mac OS X, но есть больше методов.
Для одиночных строк текста используйте:
- (CGSize)sizeWithFont:(UIFont *)font
forWidth:(CGFloat)width
lineBreakMode:(UILineBreakMode)lineBreakMode
И для многострочных текстов используйте:
- (CGSize)sizeWithFont:(UIFont *)font
constrainedToSize:(CGSize)size
lineBreakMode:(UILineBreakMode)lineBreakMode
Использование UILineBreakMode
в качестве аргумента для отдельных строк текста может сбивать с толку, но это связано с тем, что разрыв строки также используется для определения способа обрезки текста.
Взгляните на Справочник по дополнениям набора приложений NSString , в частности boundingRectWithSize: options: attributes:
. Значение, возвращаемое этой подпрограммой, должно дать вам ширину вашего NSString
.