Я хочу перетворити рядок у подвійну і, виконавши трохи математики на ній, перетворити її назад у рядок.
Як це зробити в Objective-C?
Чи є спосіб округлення подвійного до найближчого цілого числа?
Я хочу перетворити рядок у подвійну і, виконавши трохи математики на ній, перетворити її назад у рядок.
Як це зробити в Objective-C?
Чи є спосіб округлення подвійного до найближчого цілого числа?
Відповіді:
Ви можете перетворити NSString в подвійне с
double myDouble = [myString doubleValue];
Округлення до найближчого int може бути виконано як
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Я чесно не впевнений, чи існує більш обтічний спосіб перетворення назад у рядок, ніж
NSString* myNewString = [NSString stringWithFormat:@"%d", myInt];
[[NSNumber numberWithInt:myInt] stringValue]
Щоб реально перетворити з рядка в число належним чином, вам потрібно використовувати екземпляр, NSNumberFormatter
налаштований для локальної мови, з якої ви читаєте рядок.
У різних локалях цифри будуть форматовані по-різному. Наприклад, в деяких частинах світу COMMA
використовується як десятковий роздільник, а в інших PERIOD
- і роздільник тисяч (при їх використанні) повертається назад. За винятком випадків, коли це простір. Або взагалі немає.
Це дійсно залежить від походження вхідних даних. Найбезпечніше - налаштувати NSNumberFormatter
спосіб форматування та використання вашого вводу-[NSFormatter numberFromString:]
для отримання NSNumber
. Якщо ви хочете обробляти помилки перетворення, можете скористатися ними -[NSFormatter getObjectValue:forString:range:error:]
.
Додавши до відповіді olliej, ви можете перетворити з int назад в рядок з NSNumber
's stringValue
:
[[NSNumber numberWithInt:myInt] stringValue]
stringValue
на NSNumber
виклики descriptionWithLocale:nil
, даючи вам локальне рядкове подання значення. Я не впевнений, чи [NSString stringWithFormat:@"%d",myInt]
дасть вам належне локалізоване представлення myInt
.
Метод округлення olliej неправильний для від'ємних чисел
Ось альтернатива
int myInt = (int)(myDouble + (myDouble>0 ? 0.5 : -0.5))
Звичайно, можна використовувати функцію округлення з математики
Ось робочий зразок NSNumberFormatter для читання локалізованого числа String (xCode 3.2.4, osX 10.6), щоб заощадити інші години, за якими я щойно витрачався возитися. Остерігайтеся: хоча він може обробляти пробіли, такі як "8,765.4", він не може обробляти пробіли білого простору, і це не може обробляти символи бродячого тексту. (Неправильні рядки введення: "8" і "8q" і "8 q".)
NSString *tempStr = @"8,765.4";
// localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
// next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial
NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'",
tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release]; // good citizen
nil
значення, NSNumber*
якщо його неможливо проаналізувати. Я не можу відтворити ту проблему, яку ви мали із провідними білими пробілами та бродячими текстовими символами, IMO працює належним чином. " 28.5 "
розбирає , як 28,5, і "gibberish28.5"
, "28.5gibberish"
і "gibberish28.5gibberish"
все піддається синтаксичному аналізу; " 2 8 . 5. "
є незрівнянним, але це не незвично.
// Converting String in to Double
double doubleValue = [yourString doubleValue];
// Converting Double in to String
NSString *yourString = [NSString stringWithFormat:@"%.20f", doubleValue];
// .20f takes the value up to 20 position after decimal
// Converting double to int
int intValue = (int) doubleValue;
or
int intValue = [yourString intValue];
Для перетворення з числа в рядок, як щодо використання нового синтаксису літералів (XCode> = 4.4), його трохи компактніше.
int myInt = (int)round( [@"1.6" floatValue] );
NSString* myString = [@(myInt) description];
( Показує це як NSNumber і перетворює на рядок, використовуючи метод опису NSObjects )
з цього прикладу тут ви можете бачити конверсії обома способами:
NSString *str=@"5678901234567890";
long long verylong;
NSRange range;
range.length = 15;
range.location = 0;
[[NSScanner scannerWithString:[str substringWithRange:range]] scanLongLong:&verylong];
NSLog(@"long long value %lld",verylong);
перетворити текст, введений у текстовому полі в ціле число
double mydouble=[_myTextfield.text doubleValue];
округлення до найближчого подвійного
mydouble=(round(mydouble));
округлення до найближчого int (з урахуванням лише позитивних значень)
int myint=(int)(mydouble);
перетворення від подвійного до рядкового
myLabel.text=[NSString stringWithFormat:@"%f",mydouble];
або
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];
перетворення з int в рядок
myLabel.text=[NSString stringWithFormat:@"%d",myint];
або
NSString *mystring=[NSString stringWithFormat:@"%f",mydouble];