Как заставить знак знака выводить 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 должен управлять валютной позицией, в то время как ваш подкласс просто добавляет знак+. Нет времени, чтобы проверить это подробно, но, по крайней мере, это подход.