iOS:格式化十进制数字

Soo*_*nts 3 iphone objective-c

我有NSDecimalNumber代表金额.无论在哪里,我想将其打印为"999 999 999 999 999 999,00".我怎么做?

相反,NSNumberFormatter给我打印了1 000 000 000 000 000 000(苹果工程师似乎从来没有将iPhone设计成金融软件的平台).

[NSDecimalNumber description]并且[NSDecimalNumber descriptionWithLocale]都打印正确的值.如何格式化结果,将分组分隔符设置为@"\u2006",小数分隔符为@"**,**",以及小数分隔符后面的正好2位小数?

提前致谢!

更新: 这是我的解决方案,10倍于Sulthan:

@implementation NSDecimalNumber(MiscUtils)

-(NSString*)moneyToString
{
    static NSDecimalNumberHandler* s_handler = nil;
    if( !s_handler )
        s_handler = [ [ NSDecimalNumberHandler decimalNumberHandlerWithRoundingMode:NSRoundPlain scale:2 raiseOnExactness:NO raiseOnOverflow:NO raiseOnUnderflow:NO raiseOnDivideByZero:NO ] retain ];

    NSDecimalNumber *dec = [ self decimalNumberByRoundingAccordingToBehavior:s_handler ];
    NSString* str = [ dec description ];
    NSRange rDot = [ str rangeOfString:@"." ];
    int nIntDigits = str.length;
    int nFracDigits = 0;
    if( rDot.length > 0 )
    {
        nIntDigits = rDot.location;
        nFracDigits = str.length - ( rDot.location + 1 );
    }
    int nGroupSeparators = ( nIntDigits - 1 ) / 3;

    NSMutableString* res = [ NSMutableString stringWithCapacity:nIntDigits + nGroupSeparators + 3 ];
    NSString *groupingSeparator = @"\u2006";

    int nFirstGroup = ( nIntDigits % 3 );
    int nextInd = 0;
    if( nFirstGroup )
    {
        [ res appendString:[ str substringToIndex:nFirstGroup ] ];
        nextInd = nFirstGroup;
    }

    while( nextInd < nIntDigits )
    {
        if( res.length > 0 )
            [ res appendString:groupingSeparator ];
        [ res appendString:[ str substringWithRange:NSMakeRange( nextInd, 3 ) ] ];
        nextInd += 3;
    }

    if( nFracDigits > 0 )
    {
        if( nFracDigits > 2 )
            nFracDigits = 2;
        [ res appendString:@"," ];
        [ res appendString:[ str substringWithRange:NSMakeRange( rDot.location + 1, nFracDigits ) ] ];
        while( nFracDigits < 2 )
        {
            [ res appendString:@"0" ];
            nFracDigits++;
        }
    }
    else
        [ res appendString:@",00" ];
//  DLog( "formatDecimal: %@ -> %@", dec, res );
    return res;
}
@end 
Run Code Online (Sandbox Code Playgroud)

Son*_*yen 6

试试这个:

    NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"US"];

    NSNumberFormatter *frm = [[NSNumberFormatter alloc] init];
    [frm setNumberStyle:NSNumberFormatterDecimalStyle];
    [frm setMaximumFractionDigits:2];
    [frm setMinimumFractionDigits:2];
    [frm setLocale:usLocale];
    NSString *formattedNumberStr = [frm stringFromNumber:[NSNumber numberWithFloat:floatToRound]];

    [frm release];
[usLocale release];

    return formattedNumberStr;
Run Code Online (Sandbox Code Playgroud)