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?

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top