다음 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
이를 위해 최적화 된 방법이 있습니까?
답변:
$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;
}
NB .
소수점 구분 기호로 가정합니다 . 플로트 캐스트가 없기 때문에 임의로 큰 (또는 작은) 숫자로 작동한다는 이점이 있습니다. 또한 숫자를 과학적 표기법 (예 : 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 번호 : 만 볼 수 필요한 경우 소수점
페이지 또는 템플리트에 표시하기 직전에 0 자리를 제거하려는 경우.
sprintf () 함수를 사용할 수 있습니다
sprintf('%g','125.00');
//125
sprintf('%g','966.70');
//966.7
sprintf('%g',844.011);
//844.011
$x = '100.10';
$x = preg_replace("/\.?0*$/",'',$x);
echo $x;
간단한 정규식으로 해결할 수없는 것은 없습니다.)
0
에서와 같이 중요한 부분을 제거 "100"
합니다. 또한 0
s 를 제거하지 못합니다 "100.010"
.
$x = preg_replace("/(\.0*$)|((?<=\.\d*)0+$)/",'',$x);
이 질문으로 인해 오래되었습니다. 첫째, 유감입니다.
문제는 숫자 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, ','));
}
복잡한 방법이지만 작동합니다.
$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 ) );
그게 내 작은 해결책 ... 클래스에 포함시키고 변수를 설정할 수 있습니다.
개인 $ dsepparator = '.'; // 10 진수 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);