Ответ 1
Используйте NSNumberFormatter. См. Руководство по программированию форматирования данных на Число форматов.
Как добиться следующего преобразования из double в строку:
1.4324 => "1.43"
9.4000 => "9.4"
43.000 => "43"
то есть. Я хочу округлить до десятичных знаков, но не хочу никаких конечных нулей, т.е. Я не хочу
9.4 => "9.40" (wrong)
43.000 => "43.00" (wrong)
Итак, этот код, который у меня сейчас, не работает, поскольку он отображает лишние нули:
[NSString stringWithFormat: @"%.2f", total]
Используйте NSNumberFormatter. См. Руководство по программированию форматирования данных на Число форматов.
Вы сделали простую ошибку. Это будет работать:
[NSString stringWithFormat: @"%.2lf", total]
Самый простой способ - это, вероятно, бросить свой собственный. Я должен был сделать это в C раньше, так как нет способа получить нужное поведение с форматированием printf
.
В Objective-C это не намного проще. Я бы попробовал:
NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
while ([ftotal hasSuffix:@"0"]) {
ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
if ([ftotal hasSuffix:@"."]) {
ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
или этот (возможно, более быстрый) вариант:
NSString *ftotal = [NSString stringWithFormat: @"%.2f", total];
if ([ftotal hasSuffix:@".00"]) {
ftotal = [ftotal subStringToIndex [ftotal length]-3];
} else {
if ([ftotal hasSuffix:@"0"]) {
ftotal = [ftotal subStringToIndex [ftotal length]-1];
}
}
stringWithFormat
гарантирует, что в конце всегда будет ".nn"
(где n
является символом цифры). while
и if
просто отбрасывают конечные нули и конечное десятичное число, если оно является целым числом.
Очевидно, что вы можете поместить его в функцию или класс, чтобы вы могли получить его из любого места без необходимости дублировать код повсюду.
Я не знаком с объективом C, но это невозможно при стандартном форматировании в формате printf.
Использование% g будет сортировать работу, но для больших или малых чисел она будет использовать научную нотацию (например, 9.6e + 6, 4.2e-7), а не десятичную нотацию.
эквивалентный вопрос был задан здесь для C/С++, и в этом случае ответ должен использовать% f, а затем вывести любой конец 0 из строки. Не совсем элегантный.
Я уверен, что [[NSNumber numberWithFloat: f] stringValue] делает именно то, что вы хотите.