Я хотел бы иметь возможность печатать число с заданным числом значащих цифр, либо в научном формате c, либо в десятичном формате. Я пытаюсь использовать NumberFormatter, но я нахожу некоторые несоответствия. Также возможно, что я не совсем понимаю синтаксис NumberFormatter. Документация не дает много соответствующих примеров, и мне трудно найти их в Интернете.
Итак, следующий код, кажется, производит почти то, что мне нужно
// create number formatter
$nf = new NumberFormatter('it', NumberFormatter::DECIMAL);
// force the use of significant digits? I'm not sure this is the right way of using this
// option, but if I omit this line, the following ones have no effect
$nf->setAttribute(NumberFormatter::SIGNIFICANT_DIGITS_USED,1);
// set the same value for the maximum and minimum number of significant digits should force a
// given number of s.d.
$nf->setAttribute(NumberFormatter::MIN_SIGNIFICANT_DIGITS, 3);
$nf->setAttribute(NumberFormatter::MAX_SIGNIFICANT_DIGITS, 3);
// test format: the following gives what I expect, "1,31"
// (Italian locale uses a comma for the decimal separator).
echo $nf->format(1.306);
Тем не менее, он не производит то, что я хочу с "номерами на полпути". Например, echo $nf->format(1.305);
производит 1,30 вместо ожидаемого 1,31. Но echo $nf->format(1.315);
дает то, что я ожидаю: 1,32.
Это влияет как на формат DECIMAL, так и на формат SCIENTIFI C.
Я думал, что это связано с параметром "ROUND_HALFEVEN", поэтому я попытался добавить
$nf->setAttribute(NumberFormatter::ROUNDING_MODE,NumberFormatter::ROUND_HALFUP);
Однако, похоже, что это «решает» проблему только для формата SCIENTIFI C и только когда результат является целым числом. То есть: если первая строка в коде такая, как указано выше (DECIMAL), цифры 1.305; 22,45; 222,5 дают 1,30; 22,4; 222; вместо 1,31; 22,5; 223. Если я выберу формат SCIENTIFI C, те же самые три числа будут округлены до целых чисел, причем последнее даст ожидаемый результат: 1,00E0; 2,00E0; 2,23E2.
Итак, HALFUP не подходит для решения моей проблемы, или я использую его неправильно.
Конечно, я мог бы попробовать написать свою собственную функцию для правильное количество значащих цифр (или скопировать его из примеров), но я подумал, что установка правильных параметров в NumberFormatter должна сделать это для меня.
Любое понимание приветствуется.
Francesco