如何在小数点后修剪零

时间:2012-03-13 15:09:32

标签: objective-c cocoa

我试图在小数点之后修剪零,如下所示,但它没有给出所需的结果。

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 / 100之后,最初“trig”= 123我想显示1.23,但它显示为1.23000000)。

8 个答案:

答案 0 :(得分:30)

有时,直接C格式说明符比Cocoa格式化程序类更容易,并且它们可以在格式字符串中用于stringWithFormat:的正常NSString消息。

如果您的要求是不显示任何尾随零,那么“g”格式说明符可以完成工作:

float y = 1234.56789f;

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

请注意,没有精确信息,这意味着printf库将自行删除尾随零。

docs中有更多信息,涉及IEEE的docs

答案 1 :(得分:4)

如果这有助于某人。如果浮点数为“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];

答案 2 :(得分:3)

这不会在小数点后显示任何小数值:

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.”可能会发生。我想一些更聪明的解决方案很快就会发布。

答案 3 :(得分:2)

documentation开始,setFractionDigits:似乎仅用于转换另一种方式。

最好的办法是在格式化之前将数字转换为整数,例如

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

您还可以使用stringWithFormat: NSString的格式化功能,但是您将失去NSNumberFormatter带来的所有本地化优势。

答案 4 :(得分:1)

这可能不是一个适当的解决方案,有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_;
}

答案 5 :(得分:1)

我必须为我的一个程序执行此操作,这是我如何去做的:

- (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];
    }
}

答案 6 :(得分:1)

这有效

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

答案 7 :(得分:0)

这是因为你的数据类型无法格式化是这样的。