Удалите бесполезные нулевые цифры из десятичных знаков в PHP
Я пытаюсь найти быстрый способ, чтобы удалить zero decimals от числовых значений вроде этого:
echo cleanNumber('125.00');
// 125
echo cleanNumber('966.70');
// 966.7
echo cleanNumber(844.011);
// 844.011
существует ли какой-то оптимизированный способ сделать это?
19 ответов:
$num + 0делает трюк.echo 125.00 + 0; // 125 echo '125.00' + 0; // 125 echo 966.70 + 0; // 966.7внутренне, это эквивалентно приведению к плаванию с
(float)$numилиfloatval($num)но я считаю, что это проще.
вы могли бы просто использовать
floatvalфункцииecho floatval('125.00'); // 125 echo floatval('966.70'); // 966.7 echo floatval('844.011'); // 844.011
просто добавив
+в переменную строку заставит относиться к (float) и удаляет нули:echo +'125.00'; // 125 echo +'966.70'; // 966.7 echo +844.011; // 844.011 var_dump(+'844.011asdf'); // double(844.011)
вот что я использую:
function TrimTrailingZeroes($nbr) { return strpos($nbr,'.')!==false ? rtrim(rtrim($nbr,'0'),'.') : $nbr; }N. B. Это предполагает
.- это десятичный разделитель. Он имеет то преимущество, что он будет работать на сколь угодно больших (или малых) числах, так как нет плавающего приведения. Он также не превратит числа в научную нотацию (например, 1.0 E-17).
вы должны бросить свои номера как поплавки, которые сделают это за вас.
$string = "42.422005000000000000000000000000"; echo (float)$string;выход из этого будет то, что вы ищете.
42.422005
$x = '100.10'; $x = preg_replace("/\.?0*$/",'',$x); echo $x;нет ничего, что не может быть исправлено с помощью простого регулярного выражения ;)
для всех, кто приходит на этот сайт, имея ту же проблему с запятыми вместо этого, вы можете изменить:
$num = number_format($value, 1, ',', '');до
$num = str_replace(',0', '', number_format($value, 1, ',', '')); // e.g. 100,0 becomes 100это помогло мне, и я думаю, я не одинок.
Если необходимо удалить два нуля:
до
$num = str_replace(',00', '', number_format($value, 2, ',', '')); // e.g. 100,00 becomes 100подробнее здесь: PHP число: десятичная точка видна только при необходимости
Если вы хотите удалить нулевые цифры непосредственно перед отображением на странице или шаблоне.
можно использовать sprintf () функции
sprintf('%g','125.00'); //125 sprintf('%g','966.70'); //966.7 sprintf('%g',844.011); //844.011
сложный способ, но работает:
$num = '125.0100'; $index = $num[strlen($num)-1]; $i = strlen($num)-1; while($index == '0') { if ($num[$i] == '0') { $num[$i] = ''; $i--; } $index = $num[$i]; } //remove dot if no numbers exist after dot $explode = explode('.', $num); if (isset($explode[1]) && intval($explode[1]) <= 0) { $num = intval($explode[0]); } echo $num; //125.01вышеуказанные решения являются оптимальным способом, но в случае, если вы хотите иметь свой собственный Вы могли бы использовать это. Что этот алгоритм делает он начинается в конце строки и проверяет, если его 0, если это он устанавливает в пустую строку, а затем переходит к следующему символу сзади, пока последний символ не будет > 0
странно, когда я получаю номер из базы данных с типом "float" и если мой номер ex. 10000 когда я его плаваю, он становится 1.
$number = $ad['price_month']; // 1000 from the database with a float type echo floatval($number); Result : 1Я проверил все решения выше, но не работает.
из-за этого вопрос старый. Во-первых, я сожалею об этом.
вопрос о числе xxx.xx,но в случае,если это x, xxx.xxxxx или разностный десятичный разделитель, такой как xxxx, xxxx, это может быть сложнее найти и удалить нулевые цифры из десятичного значения.
/** * Remove zero digits from decimal value. * * @param string|int|float $number The number can be any format, any where use in the world such as 123, 1,234.56, 1234.56789, 12.345,67, -98,765.43 * @param string The decimal separator. You have to set this parameter to exactly what it is. For example: in Europe it is mostly use "," instead of ".". * @return string Return removed zero digits from decimal value. */ function removeZeroDigitsFromDecimal($number, $decimal_sep = '.') { $explode_num = explode($decimal_sep, $number); if (is_array($explode_num) && isset($explode_num[count($explode_num)-1]) && intval($explode_num[count($explode_num)-1]) === 0) { unset($explode_num[count($explode_num)-1]); $number = implode($decimal_sep, $explode_num); } unset($explode_num); return (string) $number; }и вот код для теста.
$numbers = [ 1234,// 1234 -1234,// -1234 '12,345.67890',// 12,345.67890 '-12,345,678.901234',// -12,345,678.901234 '12345.000000',// 12345 '-12345.000000',// -12345 '12,345.000000',// 12,345 '-12,345.000000000',// -12,345 ]; foreach ($numbers as $number) { var_dump(removeZeroDigitsFromDecimal($number)); } echo '<hr>'."\n\n\n"; $numbers = [ 1234,// 12324 -1234,// -1234 '12.345,67890',// 12.345,67890 '-12.345.678,901234',// -12.345.678,901234 '12345,000000',// 12345 '-12345,000000',// -12345 '12.345,000000',// 12.345 '-12.345,000000000',// -12.345 '-12.345,000000,000',// -12.345,000000 STRANGE!! but also work. ]; foreach ($numbers as $number) { var_dump(removeZeroDigitsFromDecimal($number, ',')); }
$str = 15.00; $str2 = 14.70; echo rtrim(rtrim(strval($str), "0"), "."); //15 echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
Это мое решение... Можно включить в класс и установить vars
private $dsepparator = '.'; // десятичное число private $tsepparator=','; / / thousand
Это может быть установлено конструктором и изменено на users lang.
class foo { private $dsepparator; private $tsepparator; function __construct(){ $langDatas = ['en' => ['dsepparator' => '.', 'tsepparator' => ','], 'de' => ['dsepparator' => ',', 'tsepparator' => '.']]; $usersLang = 'de'; // set iso code of lang from user $this->dsepparator = $langDatas[$usersLang]['dsepparator']; $this->tsepparator = $langDatas[$usersLang]['tsepparator']; } public function numberOmat($amount, $decimals = 2, $hideByZero = false) { return ( $hideByZero === true AND ($amount-floor($amount)) <= 0 ) ? number_format($amount, 0, $this->dsepparator, $this->tsepparator) : number_format($amount, $decimals, $this->dsepparator, $this->tsepparator); } /* * $bar = new foo(); * $bar->numberOmat('5.1234', 2, true); // returns: 5,12 * $bar->numberOmat('5', 2); // returns: 5,00 * $bar->numberOmat('5.00', 2, true); // returns: 5 */ }
будьте осторожны с добавлением +0.
echo number_format(1500.00, 2,".",",")+0; //1результат этого равен 1.
echo floatval('1,000.00'); // 1 echo floatval('1000.00'); //1000
Это мое решение. Я хочу сохранить возможность добавлять тысячи разделитель
$precision = 5; $number = round($number, $precision); $decimals = strlen(substr(strrchr($number, '.'), 1)); return number_format($number, $precision, '.', ',');
этот код удалит ноль после точки и вернет только две десятичные цифры.
$number=1200.0000;
как str_replace('.00',", number_format($number, 2,'.',"));выход будет: 1200
Comments