Как заставить знак знака выводить NSNumberFormatter
Я хочу использовать формат formatter для генерации моего вывода, поэтому число автоматически отформатируется для пользовательской локали, но я хочу, чтобы он работал как "%+. 1f" в printf (), который всегда имеет указанный знак.
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
nf.numberStyle = NSNumberFormatterDecimalStyle;
nf.maximumFractionDigits = 1;
double val = 3.1234;
label.text = [NSString stringWithFormat: @"XXX %@ XXX", [nf stringFromNumber: [NSNumber numberWithDouble: val]]];
Я хочу, чтобы на этикетке вышла "XXX +3.1 XXX" в США и соответствующая, но эквивалентная строка для любого другого места. Единственное, что я могу найти, это setPositiveFormat:
и setPositivePrefix:
.
Но я не хочу устанавливать формат, так как я не знаю, как форматировать числа в других странах; Я не знаю, используется ли знак плюса для обозначения положительного числа на арабском или русском языке или какой-то культуры, о которой я не думал. Я знаю, например, что десятичные точки, запятые, пробелы и т.д. Имеют разные значения в европейских странах по сравнению с США. Может ли быть так же верно для знаков +/-?
В настоящее время я делаю следующее:
label.text = [NSString stringWithFormat: @"XXX %s%@ XXX", (val < 0) ? "" : "+",
[nf stringFromNumber: [NSNumber numberWithDouble: val]]];
Но это предполагает, что "+" и "-" верны для всех форматов.
Я уверен, что он должен быть там, поскольку это стандартное форматирование, которое было в printf() со времен темноты...
Ответы
Ответ 1
Как насчет этого:
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
nf.numberStyle = NSNumberFormatterDecimalStyle;
nf.maximumFractionDigits = 1;
double val = 3.1234;
NSString *sign = (val < 0) ? [nf minusSign] : [nf plusSign];
NSString *num = [nf stringFromNumber:@(abs(val))]; // avoid double negative
label.text = [NSString stringWithFormat: @"XXX %@%@ XXX", sign, num];
Вам может потребоваться проверить, есть ли num
префикс sign
или нет, поэтому он не отображается дважды.
Изменить: после некоторого разыгрывания для стиля "Десятичный" было определено, что ни одна из существующих локалей не использует positivePrefix
. В текущей локали нет plusSign
, кроме стандартного символа +
. В текущей локали не используется negativePrefix
, отличная от minusSign
. Никакая текущая локаль не использует либо positiveSuffix
, либо negativeSuffix
.
Таким образом, более простой подход:
NSNumberFormatter *nf = [[NSNumberFormatter alloc] init];
nf.numberStyle = NSNumberFormatterDecimalStyle;
nf.maximumFractionDigits = 1;
[nf setPositivePrefix:[nf plusSign]];
[nf setNegativePrefix:[nf minusSign]];
label.text = [nf stringFromNumber:@(val)];
Ответ 2
В этом случае это просто, просто добавьте префикс:
nf.positivePrefix= nf.plusSign;
Ответ 3
Хотя он не будет использовать пользовательский язык, вы можете сделать следующее, чтобы сгенерировать знак +/- без дорогостоящих издержек NSNumberFormatter
:
// assume 'number' is an NSNumber
label.text = [NSString stringWithFormat:@"%+.02f", [number floatValue]];
Ответ 4
основной язык форматирования для NSNumberFormatter
не содержит никаких условий для того, что вы хотите сделать - это позволит вам указать локализованный положительный знак на экспонентах, но не для всей форматированной строки. Также NSLocale
, кажется, делает доступным локализованный положительный знак.
Помимо создания фиктивной строки, которая включает экспонента, вытягивая локализованный положительный знак и помещая вашу окончательную форматированную строку вместе, я думаю, вам не повезло.
Ответ 5
Повторяемый форматтер в быстрой:
var numberFormatter: NSNumberFormatter {
let formatter = NSNumberFormatter()
formatter.numberStyle = .DecimalStyle
formatter.locale = NSLocale(localeIdentifier: "it_IT")//your Locale
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 0
formatter.positivePrefix = formatter.plusSign
return formatter
}
Затем используйте его:
let myDoubleValue = 12.00
let myStringNumber = numberFormatter.stringFromNumber(myDoubleValue)!
Ответ 6
Простой случай:
let f = NumberFormatter()
f.numberStyle = .currency
f.positivePrefix = f.plusSign + f.currencySymbol
Валютный кейс:
Требуется взлома, потому что установка префикса для plusSign приведет к удалению символа валюты.
let f = NumberFormatter()
f.numberStyle = .currency
f.positivePrefix = f.plusSign + f.currencySymbol
В зависимости от языка существует немного больше работы. Символ валюты может быть до или после, но это, вероятно, еще один предмет.
Edit:
Даже если это другой вопрос, я бы сказал, что возможное решение проблемы выше - подкласс NSNumberFormatter:
override func string(from number: NSNumber) -> String? {
returns ( number.doubleValue >= 0 ? super.plusSign : "" ) + super.string(from: number)
}
Таким образом, NSNumberFormatter должен управлять валютной позицией, в то время как ваш подкласс просто добавляет знак+. Нет времени, чтобы проверить это подробно, но, по крайней мере, это подход.