Лучший формат NSString для отображения длинных десятичных чисел?

Какой формат NSString лучше всего подходит для отображения длинных десятичных чисел? Я получаю нежелательное округление, которое возникает, когда я пробую что-то вроде:

[NSString stringWithFormat:@"%g", calcResult];

В идеале мне нужен формат:

xxx,xxx.xxxxxxxxxxxxxx

с ограничением на общее количество разрядов между целыми и десятичными числами.

Так, например, если бы это ограничение составляло 10 мест, желаемым форматом был бы следующий:

1,234.567891

or

1,234,567.891

Заранее спасибо.


person Steven    schedule 04.12.2013    source источник
comment
Используйте NSNumberFormatter, чтобы номер был правильно отформатирован для языкового стандарта пользователя.   -  person rmaddy    schedule 05.12.2013
comment
Взгляните на stackoverflow.com/a/10365693/135160   -  person anka    schedule 05.12.2013


Ответы (2)


    NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

    // This style turns on locale-specific thousands separators.
    // US English uses commas.
    formatter.numberStyle = NSNumberFormatterDecimalStyle;

    // This specifies exactly 10 decimal digits of output.
    formatter.usesSignificantDigits = YES;
    formatter.minimumSignificantDigits = 10;
    formatter.maximumSignificantDigits = 10;

    NSLog(@"%@", [formatter stringFromNumber:@(1234.567891)]);
    NSLog(@"%@", [formatter stringFromNumber:@(1234567.891)]);

Вывод:

2013-12-04 17:36:32.372 numberFormatter[70896:303] 1,234.567891
2013-12-04 17:36:32.373 numberFormatter[70896:303] 1,234,567.891
person rob mayoff    schedule 04.12.2013

Чтобы преобразовать числовое значение с использованием группировки и десятичного разделителя в соответствии с желаемой локалью, вам обязательно нужно использовать NSNumberFormatter.

В экземпляре NSNumberFormatter вы можете установить желаемый алгоритм округления (количество цифр, режим округления). Также он будет автоматически использовать для вас текущую локаль. У вас останется простой

 [numberFormatter stringFromNumber:myNumber];

Обратите внимание, что вы сможете использовать разные средства форматирования с разными правилами округления: 2/3 можно напечатать как 0.6, 0.7, 0.67 и так далее. Если ваше число по своей природе десятичное, как числа, которые встречаются в финансах, вы можете использовать NSDecimalNumber для хранения числового значения. После установки экземпляр NSDecimalNumber запомнит точное количество десятичных цифр, и если вы напечатаете его с общим NSNumberFormatter, вы никогда не потеряете значащие цифры.

Вот как вы можете ограничить общее количество цифр до 10:

  1. Учитывая десятичное число, разделите или умножьте его на 10, пока оно не окажется между 0,1 и 1.
  2. Округлите до 10 цифр после десятичной точки.
  3. Выполните процедуру в обратном порядке в 1.
  4. Теперь у вас есть десятичное число с ровно 10 значащими цифрами.

Технически вы можете преобразовать NSDecimalNumber в строку без использования NSNumberFormatter на -descriptionWithLocale:. Но я не думаю, что он может делать группировки.

И если ваш код не должен быть интернационализирован, вы также можете сделать

[NSString stringWithFormat:@"%@", decimalNumber];
person ilya n.    schedule 04.12.2013