Требовать 2 десятичных знака после точки в PHP?

Я работаю с валютами, например, -

5 в порядке, поскольку это интерпретируется как 5.00. Но 5.005 не так, как он имеет слишком много цифр после точки.

Как я могу ограничить количество цифр и показать ошибку, если их слишком много?

Спасибо

5 ответов

Решение
$x = '5.005'; // declare as string to avoid floating point errors
$parts = explode('.', $x);
if (strlen($parts[1]) > 2) {
   die("Too many digits");
}

number_format исправит это для вас, но если вы хотите получить ошибку, когда слишком большая точность предоставлена, вам нужно будет проверить это.

$x = 12.345;
if ($x != number_format($x, 2)) {
    // error!
}

Следующий код захватит несколько вещей из введенной пользователем строки:

  • слишком много десятичных знаков, таких как 1.2.3,
  • более двух цифр во втором разделе (если есть), например 1.234,
  • любые нечисловые числа в первом или втором разделе, такие как 123.4a или же 1a3.45,
  • как первый, так и второй раздел пустые, такие как .,

$x = '12.34';
$parts = explode('.', $x);
$nm0a = preg_match ('/^[0-9]*$/', $parts[0]);
$nm0b = preg_match ('/^[0-9]+$/', $parts[0]);
$nm1a = preg_match ('/^[0-9]*$/', $parts[1]);
$nm1b = preg_match ('/^[0-9]+$/', $parts[1]);

if (count ($parts) > 2)           { die ("Too many decimal points"); }
if ($nm0a == 0)                   { die ("Non-numeric first part"); }
if ($nm1a == 0)                   { die ("Non-numeric second part"); }
if (($nm0b == 0) && ($nm1b == 0)) { die ("Both parts empty"); }
if (strlen ($parts[1]) > 2)       { die ("Too many digits after decimal point"); }

die ("Okay");  # Only here to provide output.

Я обычно использую sprintf

$formatted = sprintf("%01.2f", $price);

Но есть много других функций / решений, которые вы можете использовать.

Вы можете отформатировать число следующим образом:

 $num = 50695.3043;
 $num = number_format( $num, 2, '.' );
 echo $num;

Это приведет к:

 50695.30

Обратите внимание, что это раунды. Таким образом, 1,566 округляется до 1,57.

Другие вопросы по тегам