intValue يفتقد الكسور العشرية
سؤال
لدي سعر أريد تحويله بناءً على العملة المحددة.
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
يفتقد الكسور العشرية.في كل مرة أحصل على قيمة intValue من السعر، يتم تقريبها لأعلى أو لأسفل.توجد نفس المشكلة بالنسبة لسعر الصرف الذي أحصل عليه من القائمة.
لقد بحثت في NSNumberFormatter
لكنها لن تسمح لي setFormat
بالنسبة لـ NSNumberFormatter.أي نصيحة من فضلك؟
المحلول
واتخاذ سلسلة السعر وإزالة تلك الفترة. بعد ذلك تحويل NSString لوكثافة، مما يعني أنك في نهاية المطاف مع 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 الخاص بك هو السعر النهائي.
نصائح أخرى
وint
هو نوع عدد صحيح - من حيث التعريف أنه ليس لديه قيمة عشري. بدلا من محاولة:
float fprice = [price floatValue];
float currencyValue = [[plistDictionary valueForKey:@"EUR"] floatValue];
float convertedCurrency = (fprice / currencyValue);
intValue تقوم بإرجاع عدد صحيح، والذي (حسب التعريف) يتم تقريبه إلى رقم بدون كسور عشرية.
يمكنك استخدام doubleValue, ، الذي يُرجع مزدوجًا (الذي يحتوي على الجزء الكسري) أو القيمة العشرية الذي يقوم بإرجاع كائن NSDecimal.
لتعامل مع العدد الدقيق للdeciamlas وإذا كل ما تبذلونه من العملات على 2 عشرية (على سبيل المثال لا JPY) جعل جميع الأرقام عدد سنتا مثلا تخزين 43.35 EUR كما 4235.
وبعد ذلك يمكنك استخدامها في الحساب وبعد ذلك فقط التعامل مع جميع الأشكال باستخدام قيمة / 100.0 وNSNumberFormatter