web-dev-qa-db-fra.com

Comment formater correctement la devise sur iOS

Je cherche un moyen de formater une chaîne en devise sans utiliser le hack TextField.

Par exemple, je voudrais que le nombre "521242" soit converti en "5,212.42" Ou si j'ai un nombre inférieur à 1 $, je voudrais qu'il ressemble à ceci: "52" -> "0,52"

Merci

35
François Marceau

Vous voulez probablement quelque chose comme ça (en supposant que la devise est un flottant):

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

De vos exigences pour traiter 52 comme 0,52, vous devrez peut-être diviser par 100,0.

La bonne chose à propos de cette approche est qu'elle respectera les paramètres régionaux actuels. Ainsi, le cas échéant, il formatera votre exemple en "5.212,42".

Mise à jour: J'ai peut-être été un peu rapide pour publier mon exemple. Comme souligné par Conrad Shultz ci-dessous, lorsqu'il s'agit de montants en devises, il serait préférable de stocker les quantités sous la forme NSDecimalNumbers. Cela réduira considérablement les maux de tête avec des erreurs d'arrondi. Si vous procédez ainsi, l'extrait de code ci-dessus devient (en supposant que la devise est un NSDecimalNumber*):

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

J'utilise ce code. Ce travail pour moi

1) Ajouter UITextField Delegate au fichier d'en-tête

2) Ajoutez ce code (ARC activé)

- (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; }
12
AAV

Version Swift 2.0:

    let _currencyFormatter : NSNumberFormatter = NSNumberFormatter()
    _currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
    _currencyFormatter.currencyCode = "EUR"
    textField.text = _currencyFormatter.stringFromNumber(amount);
7
Bill Chan

Utilisez le code suivant et il résoudra tous vos problèmes ....

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

C'est ce que j'ai trouvé en retravaillant la réponse AAV en utilisant 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;
}
2
Joe Collins

Pour Swift code testé (ref du code 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
}

remarque: si vous souhaitez supprimer le symbole de devise par défaut de l'entrée, vous pouvez utiliser currencySymbol pour le masquer comme ci-dessous

currencyFormatter.currencyCode = nil
currencyFormatter.currencySymbol = ""

Bon codage!

1
Hardik Thakkar
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!
}

Remarque: - Un code de devise est un code à trois lettres qui, dans la plupart des cas, est composé du code de pays Internet à deux caractères d'un pays plus un caractère supplémentaire pour désigner l'unité monétaire. Par exemple, le code de devise pour le dollar australien est "AUD".

1
Vikram Pote