NSNumberFormatter numberFromString возвращает ноль - PullRequest
3 голосов
/ 06 декабря 2011

Вот мой код

NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];

    [currencyStyle setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];

    NSNumber *amount = [[NSNumber alloc] init];

    NSLog(@"the price string is %@", price);

    amount = [currencyStyle numberFromString:price];

    NSLog(@"The converted number is %@",[currencyStyle numberFromString:price]);
    NSLog(@"The NSNumber is %@", amount);

    NSLog(@"The formatted version is %@", [currencyStyle stringFromNumber:amount]);

    NSLog(@"--------------------");
    self.priceLabel.text = [currencyStyle stringFromNumber:amount]; 

    [amount release];
    [currencyStyle release];

Это то, что журнал выплевывает

Строка цены 5 Преобразованное число (ноль) NSNumber - это (ноль) Отформатированная версия (ноль)

Я что-то упустил?

РЕДАКТИРОВАТЬ: обновленный код

NSNumberFormatter *currencyStyle = [[NSNumberFormatter alloc] init];
    [currencyStyle setFormatterBehavior:NSNumberFormatterBehavior10_4];
    [currencyStyle setNumberStyle:NSNumberFormatterCurrencyStyle];

    NSNumber *amount = [currencyStyle numberFromString:price];

    NSLog(@"the price string is %@", price);
    NSLog(@"The converted number is %@",[currencyStyle numberFromString:price]);
    NSLog(@"The NSNumber is %@", amount);
    NSLog(@"The formatted version is %@", [currencyStyle stringFromNumber:amount]);
    NSLog(@"--------------------");

    self.priceLabel.text = [NSString stringWithFormat:@" %@ ", [currencyStyle stringFromNumber:amount]]; 

    [currencyStyle release];

1 Ответ

6 голосов
/ 06 декабря 2011

Что такое 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, раздвигающее границы .

...