Как отформатировать огромный NSDecimal в строку? - PullRequest
3 голосов
/ 29 марта 2012

Получил большой NSDecimal с высокой точностью.Например:

NSString *decStr = @"999999999999.999999999999";
NSDecimal dec;
NSScanner *scanner = [[NSScanner alloc] initWithString:decStr];
[scanner scanDecimal:&dec];

NSDecimalNumber *decNum = [[NSDecimalNumber alloc] initWithDecimal:*dec];

Я могу легко получить строковое представление моего NSDecimal с помощью этого:

NSString *output = [decNum stringValue];

Или

NSString *output = [decNum descriptionWithLocale:nil];

Но оно никогда не форматируетсяправильно для вывода на экран:

output = 999999999999.999999999999

Я хочу, чтобы у него было разделение на группы, например 999,999,999,999.999999999999

Итак, я попробовал NSNumberFormatter:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setAllowsFloats:YES];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle];

NSString *output = [formatter stringFromNumber:resultDecNum];

Это заканчиваетсяс этим:

output = 1,000,000,000,000

Есть ли способ получить большую высокую точность NSDecimal, правильно отформатированную на основе языкового стандарта пользователя без потери точности?

1 Ответ

1 голос
/ 29 марта 2012

Как вы уже заметили, NSNumberFormatter конвертируется в float.К сожалению, в качестве альтернативы есть только descriptionWithLocale, который не обеспечивает способ изменить желаемое поведение.Лучше всего написать собственный форматтер, Apple даже предоставит руководство для этого:

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/DataFormatting/DataFormatting.html

Я бы взял описание WocLocale в качестве отправной точки и искал разделитель.Затем добавляйте запятые через каждые 3 цифры перед ним.

Редактировать:

Другая идея состоит в том, чтобы разбить строку на целочисленную часть и материал за разделителем, а затем отформатировать целочисленную часть с помощью форматераи объедините его с остальными после этого.

// Get the number from the substring before the seperator 
NSString *output = [number descriptionWithLocale:nil];
NSNumber *integerPartOnly = [NSNumber numberWithInt:[output intValue]];

// Format with decimal separators
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
[formatter setNumberStyle:kCFNumberFormatterDecimalStyle];

NSString *result = [formatter stringFromNumber:integerPartOnly]

// Get the original stuff from behind the separator
NSArray* components = [output componentsSeparatedByString:@"."];
NSString *stuffBehindDot = ([components count] == 2) ? [components objectAtIndex: 1] : @"";

// Combine the 2 parts
NSString *result = [result stringByAppendingString:stuffBehindDot];
...