Предотвратить научную запись с выводом NSDecimalNumber как NSString - PullRequest
1 голос
/ 14 января 2012

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

РЕДАКТИРОВАТЬ 2/7/12:

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

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

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

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

Я тоже готов принять совет С.

Ответы [ 4 ]

2 голосов
/ 14 января 2012

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

// Create formatter 
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];     
[formatter setNumberStyle:NSNumberFormatterDecimalStyle]; // adjust this
NSString *formattedOutput = [formatter stringFromNumber:yourDecimalNumber];
1 голос
/ 23 января 2012

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

0 голосов
/ 25 августа 2016

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

Конвертировать двойные в строку

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
}
0 голосов
/ 14 января 2012

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

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

...