如何定义可变字符串格式说明符

How to define a variable string format specifier

我有这行代码

// valueX is a long double (long double is a huge floating point)
NSString *value = [NSString stringWithFormat: @"%.10Lg", valueX];

此格式说明符最多指定 10 个十进制数字,但我不想将其硬编码为 10。

我有这个变量 numberOfDigits,我想用它来定义位数。对于那些渴望对这个问题投反对票的人来说,这并不像看起来那么容易。我不能用 %@ 替换 10 因为 %.10Lg 本身就是一个格式说明符。

好的,我可以创建一堆字符串,例如 @"%.5Lg"@"%.8Lg"@"%.9Lg"... 并切换它们,但我想知道是否还有另一种方法...

有,如果你阅读格式说明符的手册页。您可以将精度替换为 *,这意味着它将改为从参数中获取。

int numDigits = 10;
NSString *value = [NSString stringWithFormat:@"%.*Lg", numDigits, valueX];

我在核心基础参考中找不到它,但我知道它写在 man 3 printf 手册页中。

Dietrich 的回答是最简单的,因此也是最好的。请注意,即使没有使用参数指定位数的内置方法,您仍然可以通过首先构建格式字符串然后使用它来完成它:

- (NSString *) stringFromValue: (long double) value digits: (int) digits; {

  //First create a format string. Use "%%" to escape the % escape char.
  NSString *formatString =[NSString stringWithFormat: @"%%.%dLg", digits];

  return [NSString stringWithFormat: formatString, value];
}