带有动态字符串的sprintf()

时间:2016-07-22 05:10:22

标签: php printf number-formatting hacklang

我有以下代码作为我知道将浮动转换为字符串的唯一方法,该字符串具有重现它所需的最少可能有效数字(在{C}中dtoa()模式4

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

Hack类型检查器报告错误,因为它期望sprintf()的第一个参数是一个文字字符串,因此它可以根据参数进行检查。有没有办法可以为这条线关掉它?

还是有另一种方法可以达到同样的目的吗?也许是NumberFormatter类?

1 个答案:

答案 0 :(得分:1)

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

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

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

我认为您的错误代码可能正好是4110,但我没有在我面前验证确定,请确保使用错误消息中的正确代码。

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