Правильное использование спецификатора формата для отображения до трех десятичных знаков, если это необходимо, иначе ноль десятичных знаков?

Я обнаружил, что %g показывает только десятичные знаки, если это необходимо. Если число целое, завершающая цифра .000 не добавляется, так что это хорошо. Но в случае, например, 1,12345 я хочу сократить ответ до 1,123. И в случае 1.000 я хочу показать только 1, как это уже делает %g.

Я пытался указать в строке %.3g, но это не работает. Если у кого есть ответ, буду благодарен!


person Anders Lindsetmo    schedule 01.09.2011    source источник


Ответы (3)


Я рассмотрел возможности «строки формата» в спецификации IEEE и насколько я понимаю, ваше желаемое поведение невозможно.

Я рекомендую вам использовать класс NSNumberFormatter. Я написал пример, который соответствует вашему желаемому поведению. Надеюсь, это поможет:

NSNumberFormatter *numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setDecimalSeparator:@"."];
[numberFormatter setGroupingSeparator:@""];
NSString *example1 = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:123456.1234]];
NSLog(@"%@", example1);
NSString *example2 = [numberFormatter stringFromNumber:[NSNumber numberWithFloat:123456.00]];
NSLog(@"%@", example2);
person Jan Weinkauff    schedule 02.09.2011
comment
Ян Вайнкауф - Большое спасибо! Удивительно, что вокруг есть такие люди, как вы, готовые использовать свое время, чтобы найти ответы для других! - person Anders Lindsetmo; 05.09.2011

Что вы получаете за NSLog(@"%.3g", 1.12345)?

Я сделал несколько тестов, и, насколько я понимаю, ваш вопрос вы на правильном пути. Это мои результаты:

NSLog(@"%g", 1.000000);    => 1
NSLog(@"%g", 1.123456789);  => 1.12346
NSLog(@"%.1g", 1.123456789);  => 1
NSLog(@"%.2g", 1.123456789);  => 1.1
NSLog(@"%.3g", 1.123456789);  => 1.12
NSLog(@"%.4g", 1.123456789);  => 1.123

Чтобы получить то, что вы хотите, используйте @"%.4g".

person Jan Weinkauff    schedule 01.09.2011
comment
Спасибо за ваш ответ, но он все еще не работает должным образом. - person Anders Lindsetmo; 02.09.2011
comment
%.3g не будет отображать полубольшие числа, такие как 100 000. Это будет напечатано как 1E+05, что не идеально :D. %.3f, кажется, подходит лучше всего, но это всегда оставляет нули в конце целого числа.. : ( - person Anders Lindsetmo; 02.09.2011
comment
Как мне напечатать 123456.1234 как 123456.12, а также 123456.00 как 123456? Два десятичных знака, только при необходимости..? - person Anders Lindsetmo; 02.09.2011

Вот решение Яна для Swift 4:

let numberFormatter = NumberFormatter()
numberFormatter.numberStyle = .decimal
numberFormatter.maximumFractionDigits = 2
numberFormatter.decimalSeparator = "."
numberFormatter.groupingSeparator = ""
let example1 = numberFormatter.string(from: 123456.1234)!
print(example1)
let example2 = numberFormatter.string(from: 123456.00)!
print(example2)
person vikzilla    schedule 22.01.2018