Domanda

La mia applicazione utilizza i valori monetari, e vorrei rappresentare questi valori nella valuta e formati che l'utente ha impostato sul proprio iPhone tuttavia, durante il test, mi sembrano avere problemi con il formato EURO tedesca.

Ho un metodo che restituisce un numero decimale (per la memorizzazione dei dati in core) dalla stringa di valuta formattata. La stringa è stato effettivamente formattata con un altro metodo (simile) utilizzando NSlocale.

Ho provato con il Regno Unito, Stati Uniti, Giappone e locali tedeschi, finora solo la Germania ha causato alcun problema.

Ecco il codice, la stringa di essere passato è per esempio: 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];

}

La variabile 'currencyNumber' viene stampato come: -18446912453607470532000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

mentre in tutti gli altri locali, sarebbe stampare 2.56 per la memorizzazione in Core Data come NSDecimalNumber.

È stato utile?

Soluzione

L'impostazione della proprietà:

[fmtrCurrencyFromStr setLenient:YES];

risolve il problema per la Francia, la Germania, Norvegia, Regno Unito, Stati Uniti, Giappone, Namibia, ecc ... Non posso dire che la fissa per tutti, perché non ho ancora testato tutti, ma di tutti quelli che ho testato finora, ha funzionato.

Altri suggerimenti

I pensare il problema è con la riga

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

Prova la sua sostituzione con la linea per lo più equivalente

NSDecimalNumber * currencyNumber = [fmtrCurrencyFromStr numberFromString:strNumber];

Hai impostato generatesDecimalNumbers, così i due sono praticamente equivalenti ad eccezione di un fastidioso caso:. Nil

L'invio di un messaggio a nil è garantito per non fare nulla e ritorno 0 per la maggior parte tipi standard (numero intero (tranne numeri interi non a 64 bit su vecchi tempi di esecuzione a 32 bit), in virgola mobile, tipi di puntatore); si "restituisce" alla memoria non inizializzata se il metodo restituisce una struct. NSDecimal è una struct.

(La ragione di fondo è, sostanzialmente, che il runtime non sa quanto è grande lo struct è, in modo da non sapere la quantità di memoria a zero, da cui si ottiene "non inizializzato" memoria invece. Io di solito ha colpito questo uno quando lo faccio v.frame senza accertarsi che v non è nullo.)

Modifica Naturalmente, è altro problema è il motivo per cui non è l'analisi NSNumberFormatter correttamente il prezzo. Questa è una domanda difficile. Mi piacerebbe provare spogliando il simbolo di valuta.

ho verificato che su iOS 4.3 utilizzando il [formattatore setLenient: SI] bandiera lavorato anche per me utilizzando euro. Senza questo flag impostato, il formattatore non restituisce valori corretti per euro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top