PHP - floatval сокращения позиции после десятичной точки? - PullRequest
4 голосов
/ 29 сентября 2011

У меня есть этот код PHP:

<?php
    $float = "1,99";
    echo "<p>$float<br>";
    $float = floatval($float); // Without this line number_format throws a notice "A non well formed numeric value encountered" / (float) $float leads to the same output
    $val = number_format($float, 2,'.', ',');
    echo "$float</p>";
?>

Почему возвращается 1? Не понимаю.

И: да, там есть смысл в преобразовании 1,99 в 1,99; -)

Спасибо за совет ...

Ответы [ 3 ]

6 голосов
/ 29 сентября 2011

Проблема в том, что PHP не распознает , в 1,99 как десятичный разделитель.Тип float определяется как имеющий следующее формальное определение :

LNUM          [0-9]+
DNUM          ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})

Это означает, что он будет принимать только . в качестве десятичного разделителя.Фактически это та же самая причина, по которой number_format выдает предупреждение о недопустимом типе данных, поскольку он не может преобразовать 1,99 в float внутри.

Следующее должно работать:

$float = "1,99";
echo "<p>$float<br>";
$val = number_format(str_replace(',', '.', $float), 2,'.', ',');
echo "$float</p>";
3 голосов
/ 29 сентября 2011

floatval распознает запятую (,) как символ, а не как число, поэтому он обрезает все, что следует за ним. В данном случае это 99. Пожалуйста, используйте точку (.) Вместо запятой (,), и это, вероятно, будет работать.

Пример floatval (источник: http://php.net/manual/en/function.floatval.php):

<?php
$var = '122.34343The';
$float_value_of_var = floatval($var);
echo $float_value_of_var; // 122.34343
?>
1 голос
/ 29 сентября 2011

1,99 не является допустимым php float. Проблема заключается в вашей запятой (,). В PHP вы должны использовать точку (.) В качестве разделителя с плавающей точкой.

<?php
    $float = "1.99";
    echo "<p>$float<br>";
    $float = (float)$float; 
    $val = number_format($float, 2,'.', ',');
    echo "$float</p>";
?>
...