Как указать десятичные знаки при форматировании объектов NSNumber?

Я использую следующий фрагмент кода Objective-C для форматирования NSNumber, и он отлично работает в большинстве случаев, но он не совсем делает то, что я хочу, когда объект NSNumber содержит целое число (без дробной части).

UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setFormat:@"###.##"];
int bytes = 1024 * 1024;
NSNumber *total = [NSNumber numberWithFloat:([self.totalFileSize floatValue] / bytes)];
label.text = [NSString stringWithFormat:@"0.00 MB of %@ MB", [formatter stringFromNumber:total]];

Так, например, если self.totalFileSize содержит 55.2300, он отобразит "55.23", как это должно быть на моем UILabel. Но если эта же переменная имеет значение 55, она просто отобразит "55" на ярлыке.

Я действительно хочу, чтобы этот код всегда включал в него два десятичных знака.

Как я могу это достичь?

Ответ 1

Ваша строка формата должна иметь "0" для каждого десятичного места, которое вы хотите всегда существовать.

[formatter setFormat:@"###.00"];

для "55.23" и ".23" и ".20"

[formatter setFormat:@"##0.00"];

для "55.23" и "0.23" и "0.20"

См. Синтаксис строкового формата номера (версии для Mac OS X от 10.0 до 10.3)

Или вы можете использовать форматор 10.4 с - setMinimumFractionDigits: и - setMaximumFractionDigits: с обоими настройками до 2.

Ответ 2

Я считаю, что вы ищете: "%.2f"

В худшем случае, вы можете разделить значение, проверить, есть ли что-нибудь после десятичного числа. Если вы не добавили 00 вручную?

Ответ 3

Вам может быть лучше с localizedStringWithFormat, например...

[UILabel alloc] initWithFrame:CGRectMake(80.0f, 90.0f, 225.0f, 40.0f)];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
int bytes = 1024 * 1024;
label.text = [NSString localizedStringWithFormat:@"0.00 MB of %.2f MB", ([self.totalFileSize floatValue] / bytes)];

И, конечно, байты могут быть const unsigned, а clearColor имеет тенденцию быть высокопроизводительным hog, но это проблемы для другого потока.