علة مع عملة iPhone لتنسيق اليورو مع NSDecimalNumber باستخدام NSLocale؟

StackOverflow https://stackoverflow.com/questions/4236134

سؤال

يستخدم تطبيقي القيم النقدية ، وأرغب في تمثيل هذه القيم بالعملة والتنسيقات التي حددها المستخدم على iPhone ، عند الاختبار ، يبدو أنني أواجه مشاكل في تنسيق اليورو الألماني.

لدي طريقة تُرجع رقمًا عشريًا (لتخزين البيانات الأساسية) من السلسلة المنسقة بالعملة. تم تنسيق السلسلة بالفعل بواسطة طريقة أخرى (مماثلة) باستخدام NSLOCALE.

لقد اختبرت مع أماكن المملكة المتحدة والولايات المتحدة واليابانية والألمانية ، حتى الآن تسببت ألمانيا فقط في أي مشاكل.

إليك الرمز ، السلسلة التي تم تمريرها هي على سبيل المثال: 2،56 €

+ (NSDecimalNumber*)TLCurrencyFormatFromString:(NSString*)strNumber {


NSNumberFormatter *fmtrCurrencyFromStr = nil;

fmtrCurrencyFromStr = [[NSNumberFormatter alloc] init];
[fmtrCurrencyFromStr setFormatterBehavior:NSNumberFormatterBehavior10_4];
[fmtrCurrencyFromStr setLocale:[NSLocale currentLocale]];
[fmtrCurrencyFromStr setNumberStyle:NSNumberFormatterCurrencyStyle];
[fmtrCurrencyFromStr setGeneratesDecimalNumbers:YES];


NSLog(@"Currency Separator: %@", [fmtrCurrencyFromStr decimalSeparator]); //prints a comma
NSLog(@"Currency Code: %@", [fmtrCurrencyFromStr currencyCode]); //prints EUR

int currencyScale = [fmtrCurrencyFromStr maximumFractionDigits];

NSDecimalNumberHandler *roundingBehavior = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:currencyScale raiseOnExactness:FALSE raiseOnOverflow:TRUE raiseOnUnderflow:TRUE raiseOnDivideByZero:TRUE]; 

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

NSLog(@"Currency Number = %@", [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior]);

return [currencyNumber decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

}

يتم طباعة المتغير "CurrencyNumber" على النحو التالي: -1844691245360747053200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

بينما في جميع اللغات الأخرى ، ستطبع 2.56 لتخزينها في البيانات الأساسية مثل NSDecimalNumber.

هل كانت مفيدة؟

المحلول

تعيين العقار:

[fmtrCurrencyFromStr setLenient:YES];

يعمل على إصلاح المشكلة بالنسبة لفرنسا وألمانيا والنرويج والمملكة المتحدة والولايات المتحدة واليابان و Nambia وما إلى ذلك ... لا أستطيع أن أقول أنها تعمل على إصلاحها للجميع لأنني لم أختبر كل شيء ، ولكن من بين كل تلك التي اختبرتها حتى الآن ، لقد نجحت.

نصائح أخرى

أنا فكر في مشكلتك مع الخط

NSDecimalNumber* currencyNumber = [[NSDecimalNumber alloc] initWithDecimal:[[fmtrCurrencyFromStr numberFromString:strNumber] decimalValue]];

حاول استبدالها بالخط المعاد تكافؤها في الغالب

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

لقد قمت بتعيين generatesDecimalNumbers, ، لذا فإن الاثنين متكافئان إلى حد كبير باستثناء حالة واحدة مزعجة: لا شيء.

يُضمن إرسال رسالة إلى NIL عدم القيام بأي شيء وإرجاع 0 لمعظم الأنواع القياسية (باستثناء عدد الأعداد الصحيحة 64 بت في أوقات تشغيل 32 بت قديمة) ، ونقطة عائمة ، وأنواع المؤشرات) ؛ إنها "إرجاع" الذاكرة غير المعلنة إذا كانت الطريقة تُرجع بنية. NSDecimal هو بنية.

(السبب الأساسي هو في الأساس أن وقت التشغيل لا يعرف حجم البنية ، لذلك لا يعرف مقدار الذاكرة إلى الصفر ، وبالتالي تحصل على ذاكرة "غير مهذبة" بدلاً من ذلك. عادةً ما أضغط على هذا عندما أفعل ذلك v.frame دون التأكد من أن الخامس ليس لا شيء.)

تعديل: طبعا انت آخر المشكلة هي السبب في أن nsnumberformatter لا يتم تحليل السعر بشكل صحيح. هذا واحد قاسي. سأحاول تجريد رمز العملة.

لقد تحقق من أنه على iOS 4.3 باستخدام العلم [formatter setLenient: نعم] عملت لي أيضًا باستخدام اليورو. بدون مجموعة العلم هذه ، لا يعيد Formatter القيم الصحيحة لليورو.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top