intValue le faltan decimales
Pregunta
Tengo un precio que necesito convertir según la moneda seleccionada.
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
es un NSNumber
y valueForKey
también es un número de un archivo plist que he configurado con tasas de conversión.
El problema que tengo, es que a mi precio
le faltan los decimales. Cada vez que obtengo el valor del precio, se redondea hacia arriba o hacia abajo. El mismo problema existe para el tipo de cambio que obtengo de la lista.
He buscado en NSNumberFormatter
, pero no me deja setFormat
para NSNumberFormatter. ¿Algún consejo, por favor?
Solución
Tome la cadena de precios y elimine el período. Después de eso, convierta el NSString en e int, lo que significa que terminará con 4235 centavos (o 42 dólares y 35 centavos). (Además, ¡asegúrate de que la cadena de precios que obtienes tenga dos decimales! Algunas personas son perezosas y la salida " 3.3 " por " $ 3.30 ")
NSString *removePeriod = [price stringByReplacingOccurrencesOfString:@"." withString:@""];
int convertedPrice = [removePeriod intValue];
float exchangeRate;
Luego, obtenga los tipos de cambio según la moneda seleccionada y use el siguiente código:
int convertedCurrency = round((double)convertedPrice / exchangeRate);
addCurrency = [NSString stringWithFormat: @"%0d.%02d", (convertedCurrency / 100), (convertedCurrency % 100)];
addCurrency es su precio final.
Otros consejos
int
es un tipo entero; por definición, no tiene un valor decimal. En su lugar, intente:
float fprice = [price floatValue];
float currencyValue = [[plistDictionary valueForKey:@"EUR"] floatValue];
float convertedCurrency = (fprice / currencyValue);
intValue devuelve un entero, que (por definición) se redondea a un número sin decimales.
Puedes usar doubleValue , que devuelve un doble (que tiene la parte fraccionaria) o decimalValue que devuelve un objeto NSDecimal.
Para tratar con el número exacto de deciamlas y si todas sus monedas tienen 2 decimales (por ejemplo, no JPY), haga que todos los números sean el número de centavos. p.ej. tienda 43.35 EUR como 4235.
Luego puede usar en aritmética y luego solo tratar con el formato usando value / 100.0 y NSNumberFormatter