Ответ 1
$num + 0
делает трюк.
echo 125.00 + 0; // 125
echo '125.00' + 0; // 125
echo 966.70 + 0; // 966.7
Внутри это эквивалентно кастингу для float с (float)$num
или floatval($num)
, но я нахожу его более простым.
Я пытаюсь найти быстрый способ удалить 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
Это то, что я использую:
function TrimTrailingZeroes($nbr) {
return strpos($nbr,'.')!==false ? rtrim(rtrim($nbr,'0'),'.') : $nbr;
}
N.B. Это предполагает, что .
является десятичным разделителем. Преимущество состоит в том, что он будет работать на сколь угодно больших (или малых) числах, так как нет плавающего броска. Он также не будет превращать числа в научную нотацию (например, 1.0E-17).
Просто добавление +
к вашей строковой переменной приведет к тому, что typecast будет (float) и удалит нули:
echo +'125.00'; // 125
echo +'966.70'; // 966.7
echo +844.011; // 844.011
var_dump(+'844.011asdf'); // double(844.011)
Для всех, кто заходит на этот сайт и сталкивается с той же проблемой с запятыми, измените:
$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 номер: десятичная точка видна только при необходимости
Вы должны указать свои числа как плавающие, которые сделают это для вас.
$string = "42.422005000000000000000000000000";
echo (float)$string;
Результат этого будет тем, что вы ищете.
42.422005
$x = '100.10';
$x = preg_replace("/\.?0*$/",'',$x);
echo $x;
Нет ничего, что не может быть исправлено простым регулярным выражением;)
Если вы хотите удалить нулевые цифры непосредственно перед отображением на странице или шаблоне.
Вы можете использовать функцию sprintf()
sprintf('%g','125.00');
//125
sprintf('%g','966.70');
//966.7
sprintf('%g',844.011);
//844.011
Typecast до float
.
$int = 4.324000;
$int = (float) $int;
Из-за этого вопрос старый. Во-первых, я сожалею об этом.
Вопрос о числе 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, ','));
}
Странно, когда я получаю номер из базы данных с типом "float" и, если мой номер - ex. 10000, когда я его floatval, он становится 1.
$number = $ad['price_month']; // 1000 from the database with a float type
echo floatval($number);
Result : 1
Я тестировал все вышеперечисленные решения, но не работал.
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7
Будьте осторожны с добавлением +0.
echo number_format(1500.00, 2,".",",")+0;
//1
Результат этого 1.
echo floatval('1,000.00');
// 1
echo floatval('1000.00');
//1000
Сложный способ, но работает:
$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
Вот мое небольшое решение... Может включать в класс и установить переменные
private $ dsepparator = '.'; //десятичные числа private $ tsepparator = ','; // тысяча
Это может быть установлено конструктором и изменено на 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
*/
}
$value = preg_replace('~\.0+$~','',$value);
Вы можете использовать:
print (floatval)(number_format( $Value), 2 ) );
Это моё решение. Я хочу сохранить возможность добавлять разделитель тысяч
$precision = 5;
$number = round($number, $precision);
$decimals = strlen(substr(strrchr($number, '.'), 1));
return number_format($number, $precision, '.', ',');
Это простая однострочная функция, использующая rtrim, разделитель сохранения и десятичную точку:
function myFormat($num,$dec)
{
return rtrim(rtrim(number_format($num,$dec),'0'),'.');
}
Я нашел это решение является лучшим:
public function priceFormat(float $price): string
{
//https://stackoverflow.com/a/14531760/5884988
$price = $price + 0;
$split = explode('.', $price);
return number_format($price, isset($split[1]) ? strlen($split[1]) : 2, ',', '.');
}
Просто и точно!
function cleanNumber($num){
$explode = explode('.', $num);
$count = strlen(rtrim($explode[1],'0'));
return bcmul("$num",'1', $count);
}
$число = 1200.0000;
str_replace ('. 00', '', number_format ($ number, 2, '.', ''));
Выход будет: 1200