将浮点数格式化为 NSString 时截断多余的零
Posted
技术标签:
【中文标题】将浮点数格式化为 NSString 时截断多余的零【英文标题】:Truncate extra zeroes when formatting a float into an NSString 【发布时间】:2011-12-15 10:29:47 【问题描述】:我正在尝试将一些float
s 格式化如下:
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】:这正是NSNumberFormatter
s 的用途:
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.471
和 1.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 时截断多余的零的主要内容,如果未能解决你的问题,请参考以下文章
当 .toFixed(2) 小数点后为零时,如何将浮点数格式化为整数?
如何在没有不必要的十进制 0 的情况下很好地将浮点数格式化为字符串