использование NumberFormatter для вывода с выбранным количеством значащих цифр в десятичной или научной c записи в php - PullRequest
0 голосов
/ 06 марта 2020

Я хотел бы иметь возможность печатать число с заданным числом значащих цифр, либо в научном формате 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

...