2012-08-03 36 views
33

Estoy buscando una manera de formatear una cadena en moneda sin usar el hack TextField.Cómo formatear correctamente la moneda en ios

Por ejemplo, me gustaría tener el número "521242" convertido en "5,212.42" O si tengo un número por debajo de 1 $, me gustaría que se vea así: "52" -> "0,52 "

Gracias

Respuesta

64

es probable que desee algo como esto (suponiendo que la moneda es un flotador):

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle]; 
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:currency]]; 

Desde sus requerimientos para tratar 52 como 0,52 es posible que tenga que dividir por 100,0.

Lo bueno de este enfoque es que respetará la configuración regional actual. Entonces, cuando corresponda, formateará su ejemplo como "5.212,42".

Actualización: Fui, tal vez, un poco rápido al publicar mi ejemplo. Como señala Conrad Shultz a continuación, cuando se trata de montos de moneda, sería preferible almacenar las cantidades como NSDecimalNumber s. Esto reducirá en gran medida los dolores de cabeza con errores de redondeo. Si lo hace el fragmento de código anterior se convierte en (moneda suponiendo que es un NSDecimalNumber*):

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle]; 
NSString *numberAsString = [numberFormatter stringFromNumber:currency]; 
+29

¡Nunca use flotadores para valores exactos (especialmente moneda)! Use NSDecimalNumber/NSDecimal. –

+0

¡Impresionante!Lo tenía funcionando, pero estaba luchando con el doble decimal. Era tan obvio que me lo perdí. ¡Gracias! –

+0

¡De nada! – idz

12

utilizo este código. Este trabajo para mí

1) Añadir UITextField Delegado a la cabecera del archivo

2) Incluir este código (ARC habilitado)

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

NSString *cleanCentString = [[textField.text 
           componentsSeparatedByCharactersInSet: 
           [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
          componentsJoinedByString:@""]; 
// Parse final integer value 
NSInteger centAmount = cleanCentString.integerValue; 
// Check the user input 
if (string.length > 0) 
{ 
    // Digit added 
    centAmount = centAmount * 10 + string.integerValue; 
} 
else 
{ 
    // Digit deleted 
    centAmount = centAmount/10; 
} 
// Update call amount value 
NSNumber *amount = [[NSNumber alloc] initWithFloat:(float)centAmount/100.0f]; 
// Write amount with currency symbols to the textfield 
NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init]; 
[_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[_currencyFormatter setCurrencyCode:@"USD"]; 
[_currencyFormatter setNegativeFormat:@"-¤#,##0.00"]; 
textField.text = [_currencyFormatter stringFromNumber:amount]; 
return NO; } 
+6

¡Nunca use flotadores para valores exactos (especialmente moneda)! Use NSDecimalNumber/NSDecimal. –

+0

funciona genial gracias! – RyanG

3

utilizar el siguiente código y va a resolver todos sus problemas ...

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; 
[numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle]; 
NSString *numberAsString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[currency doubleValue]]]; 
2

Esto es lo que he encontrado reelaborando la respuesta de AAV usando NSDecimalNumbers.

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 

NSString *cleanCentString = [[textField.text 
           componentsSeparatedByCharactersInSet: 
           [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
          componentsJoinedByString:@""]; 


// Parse final integer value 
NSDecimalNumber *price = [NSDecimalNumber decimalNumberWithMantissa:[cleanCentString integerValue] 
                  exponent:-2 
                 isNegative:NO]; 

NSDecimalNumber *entry = [NSDecimalNumber decimalNumberWithMantissa:[string integerValue] 
                  exponent:-2 
                 isNegative:NO]; 

NSDecimalNumber *multiplier = [NSDecimalNumber decimalNumberWithMantissa:1 
                  exponent:1 
                  isNegative:NO]; 

NSDecimalNumberHandler *handler = [NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain 
                         scale:2 
                       raiseOnExactness:NO 
                       raiseOnOverflow:NO 
                       raiseOnUnderflow:NO 
                      raiseOnDivideByZero:NO]; 
NSDecimalNumber *result; 

// Check the user input 
if (string.length > 0) 
{ 
    // Digit added 
    result = [price decimalNumberByMultiplyingBy:multiplier withBehavior:handler]; 
    result = [result decimalNumberByAdding:entry]; 
} 
else 
{ 
    // Digit deleted 
    result = [price decimalNumberByDividingBy:multiplier withBehavior:handler]; 
} 

// Write amount with currency symbols to the textfield 
NSNumberFormatter *_currencyFormatter = [[NSNumberFormatter alloc] init]; 
[_currencyFormatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
[_currencyFormatter setCurrencyCode:@"USD"]; 
textField.text = [_currencyFormatter stringFromNumber:result]; 

return NO; 
} 
6

Swift 2.0 Versión:

let _currencyFormatter : NSNumberFormatter = NSNumberFormatter() 
    _currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle 
    _currencyFormatter.currencyCode = "EUR" 
    textField.text = _currencyFormatter.stringFromNumber(amount); 
+2

No todo eso es Swift ... – brandonscript

1
func getCurrencyFormat(price:String)->String{ 
    let convertPrice = NSNumber(double: Double(price)!) 
    let formatter = NSNumberFormatter() 
    formatter.numberStyle = .CurrencyStyle 
    formatter.currencyCode = "USD"   

    let convertedPrice = formatter.stringFromNumber(convertPrice)  
    return convertedPrice! 
} 

Nota: - Un código de moneda es un código de tres letras que es, en la mayoría de los casos, compuesto de Internet de país de dos caracteres de un país código más un carácter adicional para denotar la unidad monetaria. Por ejemplo, el código de moneda para el dólar australiano es "AUD".

1

para SWIFT código (ref a partir del código de AAV)

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool{ 

    let strMain : NSString = string 

    let arrTemp : NSArray = (textField.text?.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))! 
    let str: NSString = arrTemp.componentsJoinedByString("") 

    //NSInteger centAmount = cleanCentString.integerValue; 
    var centAmount : NSInteger = str.integerValue 

    if (string.length > 0) 
    { 
     // Digit added 
     centAmount = centAmount * 10 + strMain.integerValue; 
    } 
    else { 
     // Digit deleted 
     centAmount = centAmount/10; 
    } 

    let amount = (Double(centAmount)/100.0) 

    let currencyFormatter = NSNumberFormatter() 
    currencyFormatter.numberStyle = .CurrencyStyle 
    currencyFormatter.currencyCode = "USD" 
    currencyFormatter.negativeFormat = "-¤#,##0.00" 
    let convertedPrice = currencyFormatter.stringFromNumber(amount) 

    print(convertedPrice) 

    txtAmount.text = convertedPrice! //set text to your textfiled 
    return false //return false for exact out put 
} 

nota examen: Si desea eliminar el símbolo de moneda por defecto de la entrada se puede utilizar CURRENCYSYMBOL al blanco de la siguiente manera

currencyFormatter.currencyCode = nil 
currencyFormatter.currencySymbol = "" 

Happy coding!

Cuestiones relacionadas