PHP에서 소수점 이하 자릿수 0을 제거


163

다음 zero decimals과 같이 숫자 값에서 제거하는 빠른 방법을 찾으려고합니다 .

echo cleanNumber('125.00');
// 125

echo cleanNumber('966.70');
// 966.7

echo cleanNumber(844.011);
// 844.011

이를 위해 최적화 된 방법이 있습니까?


4
값이 실제로 문자열이므로 rtrim () -php.net/manual/en/function.rtrim.php-를 '0'과 함께 사용하지 않는 것이 좋습니다. 두 번째 논쟁
Mark Baker

죄송합니다, 완전히 명확하지 않았습니다, 그들은 항상 문자열이 아닙니다, 나는 질문을 수정합니다.
vitto

9
@Mark Baker : 120 번이 12로 줄어듦에 따라 나쁜 접근 방식입니다.
machineaddict

@machineaddict-문자열 값에 소수점이없는 경우에만 가능합니다 ..... OP에 인용 된 모든 값에는 소수점이 있습니다.
Mark Baker

2
그런 다음 답변에 대담한 통지를 추가해야합니다. 소수점이있는 경우에만 작동합니다.
machineaddict

답변:


354

$num + 0 트릭을 수행합니다.

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

내부적으로 이것은 플로팅 (float)$num이나 캐스팅과 동일 floatval($num)하지만 더 간단합니다.


45
나는 이것이 더러운 속임수라고 생각합니다. 코드 floatval()가 수행하는 것과 같은 그의 행동에 대해 알려주지 않기 때문에 선호하지 않습니다 .
ESCOBAR

4
@ESCOBAR floatval의 동작은 플로트를 반환합니다. 나는 그것을 십진수 포맷터로 사용하는 것이 매우 분명하거나 깨끗하지 않다고 주장합니다.
lafor

2
이것은 매우 불분명합니다. 우리 팀은 방금 코드 에서이 문제를 겪었고 한동안 3 명의 개발자가 당황했습니다. Mark의 대답 이 더 나은 대안 이라고 생각 합니다. 더 길지만 의도는 분명합니다.
jfbalanc

2
@jfbalanc//COMMENT
Webinan

1
@ESCOBAR별로,이 타입 캐스팅에 대한 공식적 제안 방법은 ... "타입의 저글링"를 검색 php.net
게르 겔리 Lukacsy

101

당신은 floatval기능을 사용할 수 있습니다

echo floatval('125.00');
// 125

echo floatval('966.70');
// 966.7

echo floatval('844.011');
// 844.011

2
천 단위 구분 기호가 점이고 소수점이 쉼표 인 경우 실패합니다.
Munna Khan

20

이것이 내가 사용하는 것입니다 :

function TrimTrailingZeroes($nbr) {
    return strpos($nbr,'.')!==false ? rtrim(rtrim($nbr,'0'),'.') : $nbr;
}

NB .소수점 구분 기호로 가정합니다 . 플로트 캐스트가 없기 때문에 임의로 큰 (또는 작은) 숫자로 작동한다는 이점이 있습니다. 또한 숫자를 과학적 표기법 (예 : 1.0E-17)으로 바꾸지 않습니다.


이것은 안전한 해결책이 아닙니다. 가격이 10 진수가 아닌 경우 어떻게해야합니까? 예를 들어 개발자가 가격에 정수를 곱하면 정수가됩니다
amin

@alex이 함수는 정수, 부동 및 문자열에서 작동합니다.
mpen

1
bcmath의 도우미로서 완벽한 솔루션
Kart Av1k

17

단순히 +문자열 변수에 추가 하면 타입 캐스트가 (부동) 발생 하고 0이 제거됩니다.

var_dump(+'125.00');     // double(125)
var_dump(+'966.70');     // double(966.7)
var_dump(+'844.011');    // double(844.011)
var_dump(+'844.011asdf');// double(844.011)

13

쉼표로 동일한 문제가있는이 사이트를 방문하는 모든 사람을 위해 다음을 변경하십시오.

$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 번호 : 만 볼 수 필요한 경우 소수점


10

페이지 또는 템플리트에 표시하기 직전에 0 자리를 제거하려는 경우.

sprintf () 함수를 사용할 수 있습니다

sprintf('%g','125.00');
//125

‌‌sprintf('%g','966.70');
//966.7

‌‌‌‌sprintf('%g',844.011);
//844.011

고마워 나는이 답변을 좋아했다. 이것은 나에게 매우 도움이됩니다.
Sumit Kumar Gupta

9

당신은 당신을 위해 이것을 할 수있는 수레로 캐스팅해야합니다.

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

이것의 결과는 당신이 찾고있는 것입니다.

42.422005


1
플로트 캐스팅도 숫자를 손상시킬 수 있습니다. 예를 들면 (float)'0.1234567890124567890123456789'됩니다 0.12345678901246.
mpen

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

간단한 정규식으로 해결할 수없는 것은 없습니다.)

http://xkcd.com/208/


1
0에서와 같이 중요한 부분을 제거 "100"합니다. 또한 0s 를 제거하지 못합니다 "100.010".
mpen

2
모두 물러서! $x = preg_replace("/(\.0*$)|((?<=\.\d*)0+$)/",'',$x);
Emanuel S. 19


2

이 질문으로 인해 오래되었습니다. 첫째, 유감입니다.

문제는 숫자 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, ','));
}

2

+0을 추가 할 때주의하십시오.

echo number_format(1500.00, 2,".",",")+0;
//1

결과는 1입니다.

echo floatval('1,000.00');
// 1

echo floatval('1000.00');
//1000

당신은 2013에서 질문에 대답하고 있습니다.
VTodorov

3
실제 독자에게 도움이 될 수 있다면 오래된 질문에 대답하는 데 문제가되지 않습니다
Reign.85

1

"float"유형의 데이터베이스에서 숫자를 얻고 내 숫자가 ex 인 경우 이상합니다. 부수하면 10000이됩니다.

$number = $ad['price_month']; // 1000 from the database with a float type
echo floatval($number);
Result : 1

위의 모든 솔루션을 테스트했지만 작동하지 않았습니다.


1
$str = 15.00;
$str2 = 14.70;
echo rtrim(rtrim(strval($str), "0"), "."); //15
echo rtrim(rtrim(strval($str2), "0"), "."); //14.7

0

복잡한 방법이지만 작동합니다.

$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 이 될 때까지 다음 문자로 이동합니다.



0

그게 내 작은 해결책 ... 클래스에 포함시키고 변수를 설정할 수 있습니다.

개인 $ 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
     */

}

그래서 작은 샘플로 샘플 클래스를 작성했습니다. 보다 나은? =)
Paykoman

0

이것이 나의 해결책이다. 천 단위 구분 기호를 추가하는 기능을 유지하고 싶습니다.

    $precision = 5;    
    $number = round($number, $precision);
    $decimals = strlen(substr(strrchr($number, '.'), 1));
    return number_format($number, $precision, '.', ',');

0

이것은 rtrim, save separator 및 소수점을 사용하는 간단한 한 줄 함수입니다.

function myFormat($num,$dec)
 {
 return rtrim(rtrim(number_format($num,$dec),'0'),'.');
 }

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, ',', '.');
}

0

간단하고 정확한!

function cleanNumber($num){
    $explode = explode('.', $num);
    $count   = strlen(rtrim($explode[1],'0'));
    return bcmul("$num",'1', $count);
}

0

궁극적 인 해결책 : 유일한 안전한 방법은 정규 표현식을 사용하는 것입니다.

echo preg_replace("/\.?0+$/", "", 3.0); // 3
echo preg_replace("/\d+\.?\d*(\.?0+)/", "", 3.0); // 3

그것은 모든 경우에 작동합니다


0

다음은 훨씬 간단합니다

if(floor($num) == $num) {
    echo number_format($num);
} else {
    echo $num;
}

-1
$value = preg_replace('~\.0+$~','',$value);

1
코드의 기능과 원래 질문을 해결하는 방법에 대한 설명을 제공하면 답변의 품질이 향상됩니다.
Nigel Ren

@ Nikhil Gyan 나는이 답변이 좋지 않다는 데 동의합니다. 아래로 자유롭게 문의하십시오. 그러나, 나는 그것이 매우 낮은 품질의 플래그를 위해 충분히 나쁘다고 생각하지 않습니다
Sam Hartman

-2

이 코드는 점 다음에 0을 제거하고 소수점 이하 두 자리 만 반환합니다.

$ 번호 = 1200.0000;
str_replace ( '. 00', '', number_format ($ number, 2, '.', ''));

출력 : 1200

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.