将浮点数格式化为 NSString 时截断多余的零

Posted

技术标签:

【中文标题】将浮点数格式化为 NSString 时截断多余的零【英文标题】:Truncate extra zeroes when formatting a float into an NSString 【发布时间】:2011-12-15 10:29:47 【问题描述】:

我正在尝试将一些floats 格式化如下:

1.1500 将显示为“$ 1.15” 1.1000 将显示为“$ 1.10” 1.0000 将显示为“$ 1.00” 1.4710 将显示为“$ 1.471” 1.4711 将显示为“$ 1.4711”

我试过了

NSString *answer = [NSString stringWithFormat:@"$ %.2f",myvalue];

【问题讨论】:

【参考方案1】:

这正是NSNumberFormatters 的用途:

float onefifteen = 1.1500;    // displayed as “$ 1.15”
float oneten = 1.1000;     // displayed as “$ 1.10”
float one = 1.0000;    // displayed as “$ 1.00”
float onefortyseventen = 1.4710;    // displayed as “$ 1.471”
float onefortyseveneleven = 1.4711;    // displayed as “$ 1.4711”

NSNumberFormatter * formatter =  [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[formatter setUsesSignificantDigits:YES];   
// The whole number counts as the first "significant digit"
[formatter setMinimumSignificantDigits:3]; 

NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:onefifteen]]);
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:oneten]]);
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:one]]);
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:onefortyseventen]]);
NSLog(@"%@", [formatter stringFromNumber:[NSNumber numberWithFloat:onefortyseveneleven]]);

2011-12-15 19:36:52.185 重要美分[49282:903] $1.15 2011-12-15 19:36:52.190 重要美分[49282:903] $1.10 2011-12-15 19:36:52.190 重要美分[49282:903] $1.00 2011-12-15 19:36:52.191 重要美分[49282:903] $1.471 2011-12-15 19:36:52.192 重要美分[49282:903] $1.4711

【讨论】:

【参考方案2】:

试试这个:

   NSString *answer = [NSString stringWithFormat:@"%.02f", myvalue];

【讨论】:

前三个 cmets 工作正常。但不满足后两个,即 1.4710 -> 1.4711.4711 -> 1.4711 参考此链接iphonedevsdk.com/forum/iphone-sdk-development/… 在文档中它使用的是`NSString *answer = [NSString stringWithFormat:@"%g", myvalue];`对于最后两个来说没问题。但现在对于第 2、第 3 种情况,它显示 @ 987654325@ 和 1.000 -> 1 这也是不可接受的结果【参考方案3】:

我已经弄清楚了。你可以按照下面的实现来做到这一点。

请看下面的演示代码...

NSArray * numbers = [[NSArray alloc] initWithObjects:@"1.1500",@"1.1000",@"1.0000",@"1.4710",@"1.4711",nil];

for (int i=0; i<[numbers count]; i++) 
    NSArray * floatingPoint = [[numbers objectAtIndex:i] componentsSeparatedByString:@"."];
    NSString * lastObject = [[floatingPoint lastObject] stringByReplacingOccurrencesOfString:@"0" withString:@""];
    if ([lastObject length] < 2) 
        NSLog(@"%@",[NSString stringWithFormat:@"$ %.2f",[[numbers objectAtIndex:i] floatValue]]);
     else 
        NSLog(@"%@",[NSString stringWithFormat:@"$ %g",[[numbers objectAtIndex:i] floatValue]]);
    

谢谢,

MinusMaster

【讨论】:

另一个答案更简洁并使用更好的做法,因为它使用了一个为此而制作的对象,而不是弄乱字符串......【参考方案4】:

阅读format specifiers.上的文档

【讨论】:

以上是关于将浮点数格式化为 NSString 时截断多余的零的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数格式化为两位小数

如何在 Python 中将浮点数格式化为固定宽度

当 .toFixed(2) 小数点后为零时,如何将浮点数格式化为整数?

如何在没有不必要的十进制 0 的情况下很好地将浮点数格式化为字符串

如果值是整数,如何将浮点数格式化为整数。也就是说,将 13.0 显示为 13 而将 13.5 显示为 13.5

将浮点数与字符串连接并舍入到小数点后 2 位