带有动态字符串的 sprintf()

Posted

技术标签:

【中文标题】带有动态字符串的 sprintf()【英文标题】:sprintf() with dynamic string 【发布时间】:2016-07-22 05:10:22 【问题描述】:

我有以下代码作为我知道的将浮点数转换为重现它所需的有效数字最少的字符串的唯一方法(dtoa() 与 C 中的模式 4)。

$i = 14;
do 
  $str = sprintf("%.$ie", $x);
  $i++;
 while ($x != (float) $str);

Hack 类型检查器报告错误,因为它希望 sprintf() 的第一个参数是文字字符串,因此它可以根据参数检查它。有什么方法可以关闭这条线路吗?

或者还有其他方法可以实现相同的目标吗?也许是NumberFormatter 类?

【问题讨论】:

【参考方案1】:

类型检查器有various methods of suppressing errors。在这种情况下,最合适的可能是 HH_IGNORE_ERROR 来抑制此特定错误。

如所写,您的代码将产生类似Typing[4110] Invalid argument 的错误。获取错误代码,在本例中为“4110”,并使用它添加忽略注释:

/* HH_IGNORE_ERROR[4110] Allow dynamic sprintf() explain explain etc */
$str = sprintf("%.$ie", $x);

我认为您的错误代码可能正好是 4110,但我面前没有类型检查器来确定,请确保使用错误消息中的正确代码。

请注意,由于技术原因,解析器对HH_IGNORE_ERROR 非常挑剔——它必须是块样式的注释,没有我上面写的额外空格,直到最后的] 之后你可以在评论解释中写尽可能多的内容。

【讨论】:

以上是关于带有动态字符串的 sprintf()的主要内容,如果未能解决你的问题,请参考以下文章

在R中使用带有向量而不是可变数量的参数的sprintf

C++字符串处理函数总结

如何使用 sprintf 附加字符串?

sprintf()函数的用法

C语言 sprintf函数,如何生成不规则的随机字符串?

Linux C 字符串函数 sprintf()snprintf() 详解