Округление числа в PHP без преобразования его в представление локали - PullRequest
0 голосов
/ 13 января 2011

Итак, очевидно, что PHP round() выводит результат в виде строки, отформатированной в соответствии с текущими настройками локали. round( 10000.326, 1 ) может вернуть «1.000,3», что хорошо, если вы собираетесь сразу же отобразить результат, но не так хорошо, если вы планируете работать с ним дальше.

Обсуждение php.net намекает на то, что нет способа остановить round() от локализации вывода. Неужели в библиотеке нет "чистой" функции округления, которая бы возвращала int или float / double, чтобы результат мог использоваться в арифметических операциях, или вы создаете свой собственный единственный вариант?

Ответы [ 8 ]

8 голосов
/ 13 января 2011

round () не выводит результат в виде строки, отформатированной в соответствии с текущими настройками локали: возвращает с плавающей точкой ... и не имеет локализации.

float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

То, что вы потом делаете с результатом, с большей вероятностью локализует его.

Откуда у вас сложилось впечатление, что round () вернул локализованную строку?

0 голосов
/ 12 сентября 2018

Функция округления возвращает число с плавающей точкой, но формат локализован.

echo round(3.14159, 2);
setlocale(LC_ALL, 'fr_FR');
echo round(3.14159, 2);

Это то, что имел в виду оригинальный плакат.

Я предлагаю:

setlocale(LC_NUMERIC, 'en_US'); 

Это установит локализацию для десятичного разделителя на английский (США) и будет точкой.

0 голосов
/ 06 мая 2011

Это автоматическое преобразование в строку для вывода, что, вероятно, вызывает путаницу.Есть более прямой вопрос об этом .Пример был полезен для меня:

<?php
setlocale(LC_NUMERIC, 'en_US');
echo 1.234; // 1.234
setlocale(LC_NUMERIC, 'et_EE.UTF-8');
echo 1.234; // 1,234
echo number_format( 1.234, 2, '.', '' ); // 1.23 
?>
0 голосов
/ 13 января 2011

использовать sprintf как:

$val = sprintf('%.1f', 1000.326);

дает: 1000.3

0 голосов
/ 13 января 2011
float round ( float $val [, int $precision = 0 [, int $mode = PHP_ROUND_HALF_UP ]] )

Где вы видите строку вывода ???

0 голосов
/ 13 января 2011

Предполагая округление целых чисел:

floor($value + .5);

И добавьте точность вот так (это одна цифра):

$digits = 1;
floor($value * pow(10, $digits) + .5) / pow(10, d$igits);
0 голосов
/ 13 января 2011

Если вы хотите принудительно установить int, вы можете набрать приведение следующим образом:

$rnum = (int) round( 10000.326, 1 );

не уверен, что это то, что вы ищете.

Вы можете получить больше информации здесь http://php.net/manual/en/language.types.type-juggling.php

это то, что я сделал, чтобы подтвердить, я не уверен, что вы пытаетесь достичь точно

но это может помочь

$var = (int) "1.000,3";
$var1 = "1.000,3";

if(is_string($var)) print "true";
else print "false";

if(is_int($var)) print "true";
else print "false";

if(is_string($var1)) print "true";
else print "false";

результаты:

  1. ложь
  2. правда
  3. правда

Пожалуйста, поправьте меня, если я ошибаюсь. спасибо.

0 голосов
/ 13 января 2011

Я не слишком большой эксперт, но, возможно, number_format() может дать вам то, что вам нужно?Судя по комментариям, он не использует локаль, и я знаю, что он округляется.

...