Convert basic script to Objective C (money formatting)

前端 未结 2 863
日久生厌
日久生厌 2021-01-16 12:00

I\'ve got this basic like script that I need to convert to objective c, it turns big units of money into shortened versions (ie: 1.2m, etc), I\'ve got most of the conversion

2条回答
  •  孤城傲影
    2021-01-16 12:16

    Just to improve the solution, a good idea is maybe to subclass the NSNumberFormatter class and override the - (NSString *)stringForObjectValue:(id)anObject method.

    Using the code from zardon, I added a statement for the values < 1000 which doesn't format the number.

    Here is the code of the method :

    /*
        Override the stringForObjectValue method from NSNumberFormatter
    
        100 -> 100
        1000 -> 1k
        1 000 000 -> 1m
        1 000 000 000 -> 1b
        1 000 000 000 -> 1t
     */
    - (NSString *)stringForObjectValue:(id)anObject {
    
        // If we don't get a NSNumber, we can't create the string
        if (![anObject isKindOfClass:[NSNumber class]]) {
            return nil;
        }
    
        NSNumberFormatter *nformat = [[NSNumberFormatter alloc] init];
    
        // Decimal value from the NSObject
        double doubleValue = [anObject doubleValue];
    
        NSString *stringValue = nil;
    
        // Abbrevations used
        NSArray *abbrevations = [NSArray arrayWithObjects:@"k", @"m", @"b", @"t", nil] ;
    
        // If the value is less than 1000, we display directly the value
        if(doubleValue < 1000.0) {
            stringValue = [NSString stringWithFormat: @"%@", [nformat stringFromNumber: [NSNumber numberWithDouble: doubleValue]] ];
        }
        else { // Otherwise we format it as expected
            for (NSString *s in abbrevations) {
                doubleValue /= 1000.0 ;
    
                if ( doubleValue < 1000.0 ) {
    
                    if ( (long long)doubleValue % (long long) 100 == 0 ) {
                        [nformat setMaximumFractionDigits:0];
                    } else {                
                        [nformat setMaximumFractionDigits:2];
                    }
    
                    stringValue = [NSString stringWithFormat: @"%@", [nformat stringFromNumber: [NSNumber numberWithDouble: doubleValue]] ];
                    NSUInteger stringLen = [stringValue length];
    
                    if ( [stringValue hasSuffix:@".00"] )
                    {               
                        // Remove suffix
                        stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-3)];            
                    } else if ( [stringValue hasSuffix:@".0"] ) {
    
                        // Remove suffix
                        stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-2)];
    
                    } else if ( [stringValue hasSuffix:@"0"] ) {
    
                        // Remove suffix
                        stringValue = [stringValue substringWithRange: NSMakeRange(0, stringLen-1)];        
                    }
    
                    // Add the letter suffix at the end of it
                    stringValue = [stringValue stringByAppendingString: s];
    
                    break;
                }   
            }
        }
    
        [nformat release];
    
        return stringValue;
    }
    

    In the interface we simply add the inheritage statement :

    @interface MoneyNumberFormatter : NSNumberFormatter
    

    Hope this helps..

提交回复
热议问题