Как не показывать ненужные нули при заданных целых числах, но при необходимости иметь ответы float

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

Так, например, если ответ выходит на 8.52, ответ становится 8.52, но когда ответ 8, ответ 8 вместо 8.0000, я не хочу, чтобы он показывал все дополнительные 0.

- (IBAction) equalsbutton {
NSString *val = display.text;
switch(operation) {

    case Plus :
        display.text= [NSString stringWithFormat:@"%qi",[val longLongValue]+[storage longLongValue]];

    case Plus2 :
        display.text= [NSString stringWithFormat:@"%f",[val doubleValue]+[storage doubleValue]];

этот код не работает

4 ответов


эти описатели стандартные спецификаторы формата IEEE, что означает, что вы можете делать вещи, как %.2f для отображения только 2 десятичных знаков в переменной float.

вы также можете преобразовать его в int, а затем использовать %d спецификатор формата, если вы хотите сделать это таким образом.

тут же документация Apple на эту тему.

EDIT: основываясь на вашем комментарии к другому сообщению, похоже вы ищете %g, который по существу удалит посторонние 0 из поплавков.

display.text= [NSString stringWithFormat:@"%g",[val doubleValue]+[storage doubleValue]];

я нашел ответ здесь: используйте printf для форматирования поплавков без десятичных знаков, если только трейлинг 0s


изменить форматирование

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

Сначала мы получаем сумму денег в качестве строки

NSString *earnString = _money.payout.displayableAmount;

NSMutableString *strippedString = [NSMutableString
                                   stringWithCapacity:earnString.length];

//сканируйте строку, чтобы удалить что-либо, кроме чисел (включая десятичные дроби)

NSScanner *scanner = [NSScanner scannerWithString:earnString];
NSCharacterSet *numbers = [NSCharacterSet
                           characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
    NSString *buffer;
    if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
        [strippedString appendString:buffer];

    } else {
        [scanner setScanLocation:([scanner scanLocation] + 1)];
    }
}
//create an int with this new string
int earnInt = [strippedString intValue];

//если строка меньше 100, то у нас было только "изменение", поэтому отобразите эту сумму если (earnInt

/ / если у нас есть число, равномерно делимое на 100, то у нас есть целая сумма в долларах, покажите это правильно }else if (earnInt % 100 == 0){

    //The amount is exactly a dollar, display the whole number
    NSString *wholeDollar = [NSString stringWithFormat:@"$%i", (earnInt/100)];
    earnAmount.text = wholeDollar;

//наконец, если у нас есть смешанное число, то поместите их обратно вместе с десятичным числом между ними.

}else{
    //Dollar amount is not exactly a dollar display the entire amount
    NSString *dollarString = [NSString stringWithFormat: @"$%0d.%02d", (earnInt / 100), (earnInt % 100)];
    earnAmount.text = dollarString;

}

надеюсь, это поможет вам из...


вы можете попробовать этот метод вызова:

[NSString stringWithFormat:@"%.0f", [val doubleValue] + [storage doubleValue]];

самый простой способ-NSNumberFormatter. Он будет отображать только decimal, если это необходимо. Пример (Свифт):

let num1: Double = 5
let num2: Double = 5.52
let numberFormatter = NSNumberFormatter()
numberFormatter.numberStyle = .DecimalStyle
print(numberFormatter.stringFromNumber(NSNumber(double: num1)))
print(numberFormatter.stringFromNumber(NSNumber(double: num2)))

это будет печатать 5, а затем 5.52.