3

我正在寻找一种在满足以下格式要求的 NSString 中表示双精度值的方法:

1.) 没有尾随零:x = 0.5000000 -> @"0.5"

2.) 至少十进制:x = 45 -> @"45.0"

3.) 最多 8 个十进制字符(最后一位四舍五入):x = 0.000000005 -> @"0.00000001"

我尝试使用@"%.8f"、@"%g" 或@"%.8g",但至少满足一项要求都失败了。

我想我可以用 @"%.8f" 来做,然后将从字符串的最后一个字符开始的字符串循环到前面删除“0”字符,

或者,如果字符串不包含小数点,则以“%.8g”开头并附加“.0”。

有没有更智能的解决方案?

4

1 回答 1

4

您可以使用数字格式化程序执行此操作,但您需要先使用 double 创建一个 NSNumber:

NSNumber *halfNumber            = [NSNumber numberWithDouble:0.5000000];    
NSNumber *wholeNumber           = [NSNumber numberWithDouble:45];           
NSNumber *longNumber            = [NSNumber numberWithDouble:0.000000005];  

NSNumberFormatter *formatter    = [NSNumberFormatter new];
formatter.numberStyle           = NSNumberFormatterDecimalStyle;
formatter.roundingMode          = NSNumberFormatterRoundHalfUp;
formatter.minimumFractionDigits = 1;
formatter.maximumFractionDigits = 8;

NSString *halfString            = [formatter stringFromNumber:halfNumber];
NSString *wholeString           = [formatter stringFromNumber:wholeNumber];
NSString *longString            = [formatter stringFromNumber:longNumber];

NSLog(@"%@", halfString);
NSLog(@"%@", wholeString);
NSLog(@"%@", longString);

// Output is:
// 2012-11-12 04:22:41.181 Testing App[48069:fb03] 0.5
// 2012-11-12 04:22:41.182 Testing App[48069:fb03] 45.0
// 2012-11-12 04:22:41.183 Testing App[48069:fb03] 0.00000001
于 2012-11-12T09:24:09.527 回答