intValue пропускает десятичные дроби - PullRequest
1 голос
/ 10 сентября 2009

У меня есть цена, которую мне нужно конвертировать на основе выбранной валюты.

NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *finalPath = [path stringByAppendingPathComponent:@"currency.plist"];
NSDictionary *plistDictionary = [[NSDictionary dictionaryWithContentsOfFile:finalPath] retain];

int price = [price intValue];
int currencyValue = [[plistDictionary valueForKey:@"EUR"] intValue];
int convertedCurrency = (price / currencyValue);

price - это NSNumber, а valueForKey также является числом из файла plist, который я настроил с коэффициентами конверсии.

Проблема, с которой я столкнулся, заключается в том, что в моем price отсутствуют десятичные дроби. Каждый раз, когда я получаю значение от цены, оно просто округляется в большую или меньшую сторону. Та же проблема существует для обменного курса, который я получаю из списка.

Я изучил NSNumberFormatter, но он не даст мне setFormat для NSNumberFormatter. Любой совет, пожалуйста?

Ответы [ 4 ]

3 голосов
/ 10 сентября 2009

int - целочисленный тип - по определению он не имеет десятичного значения. Вместо этого попробуйте:

float fprice = [price floatValue];
float currencyValue = [[plistDictionary valueForKey:@"EUR"] floatValue];
float convertedCurrency = (fprice / currencyValue);
2 голосов
/ 10 сентября 2009

intValue возвращает целое число, которое (по определению) округляется до числа без десятичных дробей.

Вы можете использовать doubleValue , который возвращает double (который имеет дробную часть) или decimalValue , который возвращает NSDecimal объект.

1 голос
/ 11 сентября 2009

Возьмите строку цены и удалите точку. После этого конвертируйте NSString в и int, что означает, что вы получите 4235 копеек (или 42 доллара и 35 центов). (Также убедитесь, что полученная вами строка цены имеет два десятичных знака! Некоторые люди ленивы и выдают «3.3» для «$ 3.30».)

NSString *removePeriod = [price stringByReplacingOccurrencesOfString:@"." withString:@""];
int convertedPrice = [removePeriod intValue];
float exchangeRate;

Затем получите обменные курсы в зависимости от того, какая валюта была выбрана, и используйте следующий код:

int convertedCurrency = round((double)convertedPrice / exchangeRate);
addCurrency = [NSString stringWithFormat: @"%0d.%02d", (convertedCurrency / 100), (convertedCurrency % 100)];

addCurrency - ваша окончательная цена.

0 голосов
/ 10 сентября 2009

Чтобы иметь дело с точным числом десятичных знаков, и если все ваши валюты имеют 2 знака после запятой (например, не JPY), сделайте все числа числом центов например хранить 43,35 евро как 4235.

Затем вы можете использовать в арифметике, а затем просто иметь дело с форматированием, используя значение / 100.0 и NSNumberFormatter

...