How to properly format currency on ios

后端 未结 7 1095
梦谈多话
梦谈多话 2020-12-01 09:19

I\'m looking for a way to format a string into currency without using the TextField hack.

For example, i\'d like to have the number \"521242\" converted into \"5,212

相关标签:
7条回答
  • 2020-12-01 09:36

    I use this code. This work for me

    1) Add UITextField Delegate to header file

    2) Add this code (ARC enabled)

    - (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; }
    
    0 讨论(0)
  • 2020-12-01 09:40

    swift 2.0 version:

        let _currencyFormatter : NSNumberFormatter = NSNumberFormatter()
        _currencyFormatter.numberStyle = NSNumberFormatterStyle.CurrencyStyle
        _currencyFormatter.currencyCode = "EUR"
        textField.text = _currencyFormatter.stringFromNumber(amount);
    
    0 讨论(0)
  • 2020-12-01 09:41

    You probably want something like this (assuming currency is a float):

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

    From your requirements to treat 52 as .52 you may need to divide by 100.0.

    The nice thing about this approach is that it will respect the current locale. So, where appropriate it will format your example as "5.212,42".

    Update: I was, perhaps, a little speedy in posting my example. As pointed out by Conrad Shultz below, when dealing with currency amounts, it would be preferable to store the quantities as NSDecimalNumbers. This will greatly reduce headaches with rounding errors. If you do this the above code snippet becomes (assuming currency is a NSDecimalNumber*):

    NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
    [numberFormatter setNumberStyle: NSNumberFormatterCurrencyStyle];
    NSString *numberAsString = [numberFormatter stringFromNumber:currency];
    
    0 讨论(0)
  • 2020-12-01 09:42

    For Swift tested code (ref from AAV's code)

    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
    }
    

    note : if you want to remove the default currency symbol from input you can use currencySymbol to blank as below

    currencyFormatter.currencyCode = nil
    currencyFormatter.currencySymbol = ""
    

    Happy coding!

    0 讨论(0)
  • 2020-12-01 09:43
    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!
    }
    

    Note:- A currency code is a three-letter code that is, in most cases, composed of a country’s two-character Internet country code plus an extra character to denote the currency unit. For example, the currency code for the Australian dollar is “AUD”.

    0 讨论(0)
  • 2020-12-01 09:45

    This is what I have found reworking AAV answer using 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;
    }
    
    0 讨论(0)
提交回复
热议问题