Удалить бесполезные нулевые цифры из десятичных знаков в PHP

Я пытаюсь найти быстрый способ удалить zero decimals числа из числа таких значений:

 echo cleanNumber('125.00'); // 125 echo cleanNumber('966.70'); // 966.7 echo cleanNumber(844.011); // 844.011 

Существует ли какой-то оптимизированный способ сделать это?

$num + 0 делает трюк.

 echo 125.00 + 0; // 125 echo '125.00' + 0; // 125 echo 966.70 + 0; // 966.7 

Внутри это эквивалентно кастингу для float с (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; } 

NB Это предполагает . является десятичным разделителем. Преимущество состоит в том, что он будет работать на сколь угодно больших (или малых) числах, так как нет плавающего броска. Он также не будет превращать числа в научную нотацию (например, 1.0E-17).

Вы должны указать свои числа как плавающие, которые сделают это для вас.

 $string = "42.422005000000000000000000000000"; echo (float)$string; 

Результатом этого будет то, что вы ищете.

42.422005

 $x = '100.10'; $x = preg_replace("/\.?0*$/",'',$x); echo $x; 

Нет ничего, что не может быть исправлено простым регулярным выражением;)

http://xkcd.com/208/

Для всех, кто приходит на этот сайт с такой же проблемой с commata, вы можете изменить:

 $num = number_format($value, 1, ',', ''); 

в

 $num = str_replace(',0', '', number_format($value, 1, ',', '')); // eg 100,0 becomes 100 

Это помогло мне, и я думаю, что я не один.

Если необходимо удалить два нуля:

в

 $num = str_replace(',00', '', number_format($value, 2, ',', '')); // eg 100,00 becomes 100 

Подробнее здесь: Номер PHP: десятичная точка отображается только в случае необходимости

Typecast для float .

 $int = 4.324000; $int = (float) $int; 

Вы можете использовать функцию 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 

Я тестировал все вышеперечисленные решения, но не работал.

Это мое маленькое решение … Может быть включено в класс и задавать vars

private $ dsepparator = '.'; private $ tsepparator = ',';

Это может быть задано конструктором и изменено для пользователей lang.

 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); } 
 $value = preg_replace('~\.0+$~','',$value); 

Вы можете использовать:

 print (floatval)(number_format( $Value), 2 ) ); 
 $str = 15.00; $str2 = 14.70; echo rtrim(rtrim(strval($str), "0"), "."); //15 echo rtrim(rtrim(strval($str2), "0"), "."); //14.7 

Из-за этого вопрос старый. Во-первых, я сожалею об этом.

Вопрос о числе 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; } с /** * 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; } с /** * 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, ',')); } 

Этот код удалит нуль после точки и вернет только две десятичные цифры.

$ Число = 1200.0000;
str_replace ('. 00', '', number_format ($ number, 2, '.', ''));

Выход будет: 1200