From the manual at: https://www.php.net/manual/en/numberformatter.format.php
public NumberFormatter::format ( int|float $value , int $type = ? ) : string
This code:
$a = new \NumberFormatter('en_US', \NumberFormatter::CURRENCY);
$string = $a->format(123, \NumberFormatter::TYPE_CURRENCY);
var_dump($string);
Causes this:
PHP Fatal error: Uncaught ValueError: NumberFormatter::format(): Argument #3 must be a NumberFormatter::TYPE_* constant
Huh? Argument #3? There is no argument #3 (except in the procedural version)! And this code (thinking that maybe the documentation is wrong and nobody has ever spotted it before now):
$a = new \NumberFormatter('en_US', \NumberFormatter::CURRENCY);
$string = $a->format(123, 'USD', \NumberFormatter::TYPE_CURRENCY);
var_dump($string);
But it just causes this:
PHP Fatal error: Uncaught ArgumentCountError: NumberFormatter::format() expects at most 2 arguments, 3 given
Okay... So how do you want it, PHP? Is it 3 or 2? I'm lost at this point.
Important: The reason I'm not using formatCurrency even though it is definitely a currency number, is that (in the real code) I'm trying to remove the currency symbol but otherwise format it as a currency. formatCurrency sadly ignores the setSymbol, but format honors it. That's why format is used in this case. Thus, please don't tell me to use formatCurrency.
It appears that the documentation on the
intlextension is a little incomplete or misleading. It would seem that callingformat()without the second type argument will produce the output you want on yourNumberFormatter::CURRENCYobject:The docs show that argument as optional but do not apparently explain how or when it should be used. In this case, omitting it seems to do the job.