Как указать десятичные знаки при форматировании объектов 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, но это проблемы для другого потока.