Как обрезать нули после десятичной точки

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

trig = [currentVal doubleValue];
trig = trig/100;
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setMaximumFractionDigits:0];
display.text = [formatter stringFromNumber:[NSNumber numberWithDouble:trig]];

число по-прежнему отображается без обрезки нулей после десятичной точки.

здесь currentVal - это номер, который я ввожу.

например, если я передаю "trig" = 123 (первоначально "trig" = 123 после выполнения trig/100 я хочу отобразить 1.23, но он отображается как 1.23000000).

8 ответов


С документация, это выглядит как setFractionDigits: предназначен только для преобразования в другую сторону.

лучшее, что можно сделать, это, вероятно, преобразовать ваш номер в целое число перед его форматированием, например

 double converted = round(trig); // man round for docs

вы можете использовать также функции форматирования stringWithFormat: of NSString, но тогда вы потеряете все преимущества локализации, которые вы получите с NSNumberFormatter.


иногда спецификаторы формата straight C выполняют более простую работу, чем классы форматирования Cocoa, и их можно использовать в строке формата для normal stringWithFormat: сообщение NSString.

если ваше требование не показывать конечные нули, то спецификатор формата " g " выполняет эту работу:

float y = 1234.56789f;

NSString *s = [NSString stringWithFormat:@"%g", y];

обратите внимание, что нет точной информации, что означает, что printf библиотека сама удалит конечные нули.

больше информация в docs, которые относятся к IEEE docs.


в случае, если это помогает кому-то. Я хотел 1 десятичное значение но нет.0 'на конце, если поплавок был "1.0". Использование %g дало бы научную нотацию для более длинных чисел, следующее уродство работало достаточно хорошо для меня, поскольку высокая точность не была критической.

// Convert to 1 dp string,
NSString* dirtyString = [NSString stringWithFormat: @"%.1f", self.myFloat];

// Convert back to float that is now a maximum of 1 dp,
float myDirtyFloat = [dirtyString floatValue];

// Output the float subtracting the zeros the previous step attached
return [NSString stringWithFormat: @"%g", myDirtyFloat];

это не будет отображать десятичное значение после запятой:

display.text = [NSString stringWithFormat:@"%1.0f", trig];

это будет просто обрезать нули после запятой:

isplay.text = [NSString stringWithFormat:@"%3.2f", trig];
display.text = [display.text stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:[NSString stringWithFormat@"0"]]];

Примечание, это может оставить вас с конечной десятичной запятой. "124." может случиться. Я думаю, что какое-то более умное решение будет опубликовано в ближайшее время.


Это может быть не правильное решение, где есть NSNumberFormetter класс, но я просто сделал это, а не гуглил много! ;)

вот пример, если это поможет:

-(NSString*) trimZerosAfterDecimalPoint:(NSString*)string_ {

    double doubleValue=[string_ doubleValue];    
    long   leftPart=(long)doubleValue;
    double rightPart=doubleValue-(double)leftPart;

    NSString *rightPartAsStr=[NSString stringWithFormat:@"%f", rightPart];

    int i=0;
    for (i=rightPartAsStr.length-1; i>=2; i--) {
        if ([rightPartAsStr characterAtIndex:i]!='0') {            
            rightPartAsStr=[rightPartAsStr substringWithRange:NSMakeRange(2, i-1)];
            break;
        }
    }

    if (i<2) {
        string_=[NSString stringWithFormat:@"%ld", leftPart];
    } else {
        string_=[NSString stringWithFormat:@"%ld.%@", leftPart, rightPartAsStr];
    }

    return string_;
}

Мне просто нужно было сделать это для одной из моих программ и вот как я это сделал:

- (void) simplify{
        int length = (int)[self.calcString length];
        for (int i = (int)[self.calcString length]; i > 0; i--) {
            if  ([self.calcString rangeOfString:@"."].location != NSNotFound) {
                NSRange prevChar = NSMakeRange(i-1, 1);
                if ([[self.calcString substringWithRange:prevChar] isEqualToString:@"0"]||
                    [[self.calcString substringWithRange:prevChar] isEqualToString:@"."]) 
                    length--;
                else
                    break;
        }
        self.calcString = [self.calcString substringToIndex:length];
    }
}

это работает

display.text = [@(trig) stringValue];

Это потому, что ваших данных не может быть отформатирован таким образом.