在Objective C中格式化浮点数

Ada*_*tle 33 string floating-point formatting cocoa objective-c

我需要将一个浮点数(引人注目的标题,他?)格式化为2位小数,但前提是这些小数位的值不是零.例:

我有一个名为'answer'的NSTextField,在我用几个浮点数进行数学运算之后,我想将'answerFloat'变量赋给'answer'NSTextField.到目前为止我有:

[answer setStringValue:[NSString stringWithFormat:@"%.2f", answerFloat]];
Run Code Online (Sandbox Code Playgroud)

但这设置了45到45.00之类的东西.我想要显示没有零的整数,以及要显示的十进制数和它们各自的十进制值.

在将它提供给stringWithFormat之前,是否需要运行某种检查?或NSString提供了一种方法来处理这个问题?

Mar*_*sey 45

你试过%g格式说明符吗?

NSLog([NSString stringWithFormat:@"%g, %g", 45.0, 45.5]);
Run Code Online (Sandbox Code Playgroud)

2010-01-12 19:54:38.651 foo [89884:10b] 45,45.5

  • 这个问题是,如果数字足够大,它将以指数形式存在.我认为有一种方法可以仅仅使用格式字符串来获取行为,而不会冒成指数形式的风险. (3认同)

Mar*_*man 23

%g的问题在于它没有办法指定舍入增量(至少,不是我能找到的).

您可以像这样使用NSNumberFormatter来使用具有未定义的小数位数的数字来实现结果.

double none = 5;
double one = 5.1;
double two = 5.01;
double lots = 5.918286558251858392107584219;

NSNumber *numberNone = [NSNumber numberWithDouble:none];
NSNumber *numberOne = [NSNumber numberWithDouble:one];
NSNumber *numberTwo = [NSNumber numberWithDouble:two];
NSNumber *numberLots = [NSNumber numberWithDouble:lots];

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
formatter.roundingIncrement = [NSNumber numberWithDouble:0.01];
formatter.numberStyle = NSNumberFormatterDecimalStyle;

NSLog(@"%@",[formatter stringFromNumber:numberNone]);
NSLog(@"%@",[formatter stringFromNumber:numberOne]);
NSLog(@"%@",[formatter stringFromNumber:numberTwo]);
NSLog(@"%@",[formatter stringFromNumber:numberLots]);
Run Code Online (Sandbox Code Playgroud)

输出:

2012-02-15 16:21:17.469 AwakeFromNib[53043:f803] 5
2012-02-15 16:21:17.470 AwakeFromNib[53043:f803] 5.1
2012-02-15 16:21:17.470 AwakeFromNib[53043:f803] 5.01
2012-02-15 16:21:17.471 AwakeFromNib[53043:f803] 5.92
Run Code Online (Sandbox Code Playgroud)