2010-11-21 13 views
0

Uygulamam parasal değerleri kullanıyor ve bu değerleri iPhone'da ayarladığı para birimi ve biçimlerinde temsil etmek istiyorum, ancak test yaparken Alman EURO formatı ile sorun yaşıyorum.NSLocale kullanarak NSDecimalNumber ile Euro biçiminde iPhone Para Birimi ile hata?

Para birimi biçimlendirilmiş dizeden bir ondalık sayı (çekirdek veri depolamak için) döndüren bir yöntem var. Dize aslında NSlocale kullanılarak başka bir (benzer) yöntemle biçimlendirildi.

Birleşik Krallık, ABD, Japon ve Alman yerelleriyle test ettim, şimdiye kadar sadece Almanya herhangi bir soruna neden oldu. Tüm oysa -18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

: 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' değişken olarak basılmış alır: Burada

kod, geçirilen dize örneğin şöyledir Diğer yereller, NSDecimalNumber olarak Core Data'ya saklamak için 2.56 basardı.

cevap

2

özelliğinin ayarlanması:

[fmtrCurrencyFromStr setLenient:YES]; 

Düzeltmeler vb Fransa, Almanya, Norveç, İngiltere, ABD, Japonya, Nambia için sorun ... Ben herkes için bunu düzeltir diyemeyiz ben cenneti çünkü' t hepsini test ettim, ama şimdiye kadar test ettiğim bütün bunlardan, işe yaradı.

0

bence senin sorunun

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

Sen generatesDecimalNumbers kurdum

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber]; 

çoğunlukla eşdeğer çizgi ile değiştirmeyi deneyin hattı ile, yani iki hemen hemen eşdeğerdir bir can sıkıcı durum haricinde: nil.

Nil'e bir ileti göndermek, hiçbir şey yapmama ve çoğu standart tür için 0 döndürme (eski 32 bit çalışma zamanlarında 64 bit tamsayılar hariç), kayan nokta, işaretçi türleri için) sağlanır; Metodu bir struct döndürürse, başlatılmamış belleğini "döndürür". NSDecimal bir yapıdır.

(Temel neden, çalışma zamanının yapının ne kadar büyük olduğunu bilmemesidir, bu nedenle ne kadar bellek sıfır olduğunu bilmez, dolayısıyla "başlatılmamış" bellek alırsınız. v sıfır değildir olduğundan emin olmadan v.frame yapmak)

EDIT:. elbette, NSNumberFormatter fiyatın doğru ayrıştırma neden görünmediğini diğer sorundur. Bu zor bir tane. Para birimi simgesini çıkarmayı denerdim.

0

[formatter setLenient: YES] bayrağının kullanıldığı iOS 4.3'te, Euro'yu kullanmam için bana çalıştığımı doğruladım. Bu bayrak kümesi olmadan, biçimlendirici, Euro için doğru değerleri döndürmez.

İlgili konular