我正在尝试找到一种zero decimals
从数字值中删除的快速方法,如下所示:
echo cleanNumber('125.00');
// 125
echo cleanNumber('966.70');
// 966.7
echo cleanNumber(844.011);
// 844.011
是否存在某种优化的方法?
我正在尝试找到一种zero decimals
从数字值中删除的快速方法,如下所示:
echo cleanNumber('125.00');
// 125
echo cleanNumber('966.70');
// 966.7
echo cleanNumber(844.011);
// 844.011
是否存在某种优化的方法?
Answers:
$num + 0
绝招。
echo 125.00 + 0; // 125
echo '125.00' + 0; // 125
echo 966.70 + 0; // 966.7
在内部,这等效于使用(float)$num
或进行浮点转换,floatval($num)
但我发现它更简单。
floatval()
这样做那样说明他的行为。
floatval
的行为返回一个浮点数。我认为使用它作为小数点格式器不是很明显,也不是干净的。
//COMMENT
你可以只使用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;
}
注意:这.
是十进制分隔符。它的优点是,由于没有浮点强制转换,因此可以处理任意大(或小)数字。它还不会将数字转换为科学计数法(例如1.0E-17)。
对于所有来此网站的人,如果他们在逗号上都遇到相同的问题,请更改:
$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
您应该将数字转换为浮点数,这将为您做到这一点。
$string = "42.422005000000000000000000000000";
echo (float)$string;
此输出将是您想要的。
42.422005
(float)'0.1234567890124567890123456789'
成为0.12345678901246
。
由于这个问题太老了。首先,对此我感到抱歉。
问题是关于数字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, ','));
}
加+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
您可以使用:
print (floatval)(number_format( $Value), 2 ) );
多数民众赞成在我的小解决方案...可以包含到一个类,并设置vars
private $ dsepparator ='。'; //十进制小数$ 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
*/
}
最终解决方案:唯一安全的方法是使用正则表达式:
echo preg_replace("/\.?0+$/", "", 3.0); // 3
echo preg_replace("/\d+\.?\d*(\.?0+)/", "", 3.0); // 3
在任何情况下都可以使用
$value = preg_replace('~\.0+$~','',$value);