Что такое price
?Предполагая, что это ивар, не обращайтесь к ивару напрямую.Всегда используйте методы доступа, за исключением dealloc
и init
.
Если price
является строкой, почему вы делаете это:
[NSString stringWithFormat:@"%@", price]
Если price
является NSNumber
, тогда вы можете использовать его напрямую.
Вы создаете NSNumber
здесь, присваиваете ему amount
, а затем сразу же выбрасываете его.Затем вы перепроизводите amount
.Таким образом, вы должны ожидать, что вышеприведенный код вылетит.(Из-за странного подхода к управлению NSNumber
объектами этот сбой произойдет в следующий раз, когда вы создадите NSNumber
для целого числа 5.)
И получите полный доступ к вашему актуальному вопросу,причина в том, что nil
в том, что «5» не в текущем формате валюты, поэтому средство форматирования чисел отклонило его.Если вы находитесь в США и установите для price
значение «$ 5,00», это сработает.
Если вы действительно пытаетесь преобразовать строку в доллары США, то вот как это сделать.,Обратите внимание, что язык имеет значение здесь.Если вы используете локаль по умолчанию, то во Франции «1,25» будет составлять € 1,25, что не равно $ 1,25.
Вы всегда должны использовать NSDecimalNumber
при удержании смородины.В противном случае возможны ошибки двоичного / десятичного округления.
В следующем примере используется ARC.
NSString *amountString = @"5.25";
NSDecimalNumber *amountNumber = [NSDecimalNumber decimalNumberWithString:amountString];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];
[currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];
[currencyStyle setLocale:locale];
NSString *currency = [currencyStyle stringFromNumber:amountNumber];
NSLog(@"%@", currency);
В примере доступен более полный класс для управления локализованной валютой (RNMoney
).код для главы 13 из Программирование на iOS 5, раздвигающее границы .