Предотвращение экспоненциальной записи с выводом NSDecimalNumber как NSString

У меня проблема, похожая на ту, что в этом вопросе: Как получить неформатированное строковое представление NSDecimal или NSDecimalNumber? Мне нужно число в строковом формате, точно представленное как NSNumber, но это число преобразуется обратно в строку в других местах, и Я не могу этого избежать. Проблема, с которой я сталкиваюсь, заключается в том, что когда число преобразуется обратно в строку, в некоторых случаях строка находится в экспоненциальном представлении.

NSDecimalNumber *dn = [NSDecimalNumber decimalNumberWithString:@"0.0001"];
NSString *s = [dn stringValue]; // s will be @"1E-4"

Как предотвратить отображение этого числа в экспоненциальном представлении?

Я работаю в версии GNUstep примерно 2005 года (возможно, v1.11.1 для GNUstep Base), а не на Mac или iPhone, что может объяснить некоторые различия в поведении по сравнению с другим вопросом, на который я ссылался. Я просмотрел API базовой библиотеки и документации в моей собственной установке GNUstep, но я не могу найти ничего, что могло бы помочь.

РЕДАКТИРОВАНИЕ 7 февраля 2012 г.:

Вопрос немного изменился, но цель осталась прежней. Первоначально я не думал, что смогу управлять частью вывода строки, но я могу передать значение обратно в виде строки. На данный момент я пытаюсь использовать строку форматирования, но я все еще хочу предотвратить появление научной нотации.

[NSString stringWithFormat:@"%1.14g", [val doubleValue]]

Я решил использовать %g, потому что нам нужно определенное количество значащих цифр для значения. Если я использую %f, я могу обрезать лишние нули, но число не всегда получается чистым. Например, 800000000,79 выглядит как 800000000,7899999600.

Есть ли способ получить чисто отформатированное число с определенным количеством значащих цифр (или знаков после запятой) без отображения экспоненциального представления перед этим количеством цифр?

Я также готов принять совет C.


person Jay Sheridan    schedule 13.01.2012    source источник


Ответы (4)


Вы должны проверить NSNumberFormatter

// Create formatter 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];     
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // adjust this
NSString *formattedOutput = [formatter stringFromNumber:yourDecimalNumber];
person Sanjit Saluja    schedule 13.01.2012
comment
Похоже, что в какой бы версии GNUstep мы ни использовали (может быть, 1.11.1?), класс NSNumberFormatter реализован не полностью. Документы содержат это сообщение: Этот класс в настоящее время не реализован в GNUstep! Все установленные методы будут работать, но stringForObject: полностью проигнорирует формат. В приведенной ниже документации описано, каким ДОЛЖНО быть поведение... - person Jay Sheridan; 23.01.2012

Как насчет того, чтобы получить значение C (double, int, long и т. д.), а затем отформатировать его как строку C или как NSString с stringWithFormat:?

person Monolo    schedule 23.01.2012

Попробуйте напечатать число, используя NSNumberFormatter вместо метода stringValue. У него гораздо больше возможностей.

(Я предполагаю, что NSNumberFormatter доступен на GNUstep)

person Nick Lockwood    schedule 13.01.2012

Используйте приведенные ниже методы, чтобы избежать представления нотации научной экспоненты.

Преобразовать двойное число в строку

func getStringFrom(double doubleVal: Double) -> String
{
    var stringValue : String = "0.00"

    let formatter = NSNumberFormatter()
    formatter.usesSignificantDigits = true;
    formatter.maximumSignificantDigits = 100
    formatter.groupingSeparator = "";
    formatter.numberStyle = .DecimalStyle
    stringValue = formatter.stringFromNumber(doubleVal)!;

    return stringValue

}

Преобразовать строку в двойную

func getDoubleFrom(textField textField: UITextField) -> Double
{
    var doubleValue : Double = 0.0

    if let val = textField.text
    {
        let numberFormatter = NSNumberFormatter()
        numberFormatter.numberStyle = NSNumberFormatterStyle.DecimalStyle
        let finalNumber = numberFormatter.numberFromString(val)
        doubleValue = (finalNumber?.doubleValue)!;
    }

    return doubleValue
}
person Shanavas P S    schedule 25.08.2016