programing

PHP의 십진수에서 불필요한 0자리 제거

goodsources 2022. 9. 6. 22:36
반응형

PHP의 십진수에서 불필요한 0자리 제거

빨리 제거할 수 있는 방법을 찾고 있어요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기능.

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)으로 변환하지 않습니다.

추가만 하면 됩니다.+string 변수를 지정하면 typecast to (typecast to)가 발생하고 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)

대신 Commata와 관련하여 동일한 문제를 겪고 있는 이 사이트를 방문하는 모든 사용자의 경우 다음을 변경하십시오.

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

대상:

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


삭제할 0이 2개 있는 경우는, 다음과 같이 변경합니다.

$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

당신은 당신의 번호를 플로트로 던져야 합니다. 그러면 당신은 이것을 할 수 있을 것입니다.

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

이 출력은 당신이 원하는 것이 될 것입니다.

42.422005

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

단순한 regex로 수정할 수 없는 것은 없습니다.

http://xkcd.com/208/

Typecast에float.

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

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

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

그 결과는 1입니다.

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

echo floatval('1000.00');
//1000

그래서 이 질문은 오래되었다.일단 죄송합니다.

이 질문은 xxx.xx에 관한 것입니다만, x, xxx.xxxx 또는 xxx, xxxx와 같은 차이 소수 구분자일 경우, 이 값을 검색하여 10진수 값에서 0자리 숫자를 삭제하는 것이 더 어려울 수 있습니다.

/**
 * Remove zero digits (include zero trails - 123.450, 123.000) 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. Only return as string!
 */
function removeZeroDigitsFromDecimal($number, $decimal_sep = '.')
{
    $explode_num = explode($decimal_sep, $number);
    if (is_countable($explode_num) && count($explode_num) > 1) {
        // if exploded number is more than 1 (Example: explode with . for nnnn.nnn is 2)
        // replace `is_countable()` with `is_array()` if you are using PHP older than 7.3.
        $explode_num[count($explode_num)-1] = preg_replace('/(0+)$/', '', $explode_num[count($explode_num)-1]);
        if ($explode_num[count($explode_num)-1] === '') {
            // if the decimal value is now empty. 
            // unset it to prevent nnn. without any number.
            unset($explode_num[count($explode_num)-1]);
        }
        $number = implode($decimal_sep, $explode_num);
    }
    unset($explode_num);
    return (string) $number;
}

그리고 여기 테스트용 코드가 있습니다.

$tests = [
    1234 => 1234,
    -1234 => -1234,
    '12,345.67890' => '12,345.6789',
    '-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 ($tests as $number => $assert) {
    $result = removeZeroDigitsFromDecimal($number);
    assert($result === (string) $assert, new \Exception($result . ' (' . gettype($result) . ') is not matched ' . $assert . ' (' . gettype($assert) . ')'));
    echo $number . ' =&gt; ' . (string) $assert . '<br>';
}

echo '<hr>' . PHP_EOL;

$tests = [
    1234 => 1234,
    -1234 => -1234,
    '12.345,67890' => '12.345,6789',
    '-12.345.678,901234' => '-12.345.678,901234',
    '12345,000000' => '12345',
    '-12345,000000' => '-12345',
    '-12.345,000000000' => '-12.345',
    '-12.345,000000,000' => '-12.345,000000',// this is correct assertion. Weird ,000000,000 but only last 000 will be removed.
];
foreach ($tests as $number => $assert) {
    $result = removeZeroDigitsFromDecimal($number, ',');
    assert($result === (string) $assert, new \Exception($result . ' (' . gettype($result) . ') is not matched ' . $assert . ' (' . gettype($assert) . ')'));
    echo $number . ' =&gt; ' . (string) $assert . '<br>';
}

모든 테스트에 합격하고 오류가 없어야 합니다.

왜죠'-12.345,000000,000'될 것이다'-12.345,000000'것은 아니다.'-12.345'?
이 함수는 10진수 값에서 0자리 숫자(추적 0개 포함)를 제거하기 위한 함수이기 때문입니다.올바른 번호 형식에 대한 검증이 아닙니다.그건 또 다른 기능이 될 거예요.

왜 항상 문자열로 반환됩니까?
계산에서 사용하는 것이 더 좋기 때문입니다.bcxxx함수를 지정하거나 큰 숫자와 함께 사용합니다.

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

이 솔루션이 가장 좋다는 것을 알게 되었습니다.

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

다음은 훨씬 단순합니다.

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

다음을 시도할 수 있습니다.

rtrim(number_format($coin->current_price,6),'0.')

예 1

$value =81,500.00;
{{rtrim(rtrim(number_format($value,2),0),'.')}}

산출량

81,500

예 2

$value=110,763.14;
{{rtrim(rtrim(number_format($value,2),0),'.')}}

산출량

110,763.14

때때로, 특히 화폐 금액의 경우, 0이 2인 경우에만 제거하고 인쇄하지 않을 수 있습니다.€ 2.1대신 대신€ 2.10.

실장은 다음과 같습니다.

function formatAmount(string|float|int $value, int $decimals = 2): string
{
    if (floatval(intval($value)) === floatval($value)) {
        // The number is an integer. Remove all the decimals
        return (string)intval($value);
    }

    return number_format($value, $decimals);
}

예상되는 출력의 예:

0.1000 => 0.10
20.000 => 20
1.25 => 1.25

복잡한 방법이지만 작동:

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

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

다음을 사용할 수 있습니다.

print (floatval)(number_format( $Value), 2 ) );    

그게 내 작은 해결책이야...클래스에 포함할 수 있으며 변수 설정

private $dseparator = '.'; // private $tseparator= '', // 1,000을 10진수로 지정합니다.

컨스트럭터별로 설정해, 유저 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
     */

}

이게 제 해결책입니다.수천 구분자를 추가할 수 있는 능력을 유지하고 싶다.

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

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

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

심플하고 정확하게!

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

다음과 같은 간단한 코드를 사용합니다.

define('DECIMAL_SEPARATOR', ','); //To prove that it works with different separators than "."

$input = "50,00";

$number = rtrim($input, '0');                // 50,00 --> 50,
$number = rtrim($number, DECIMAL_SEPARATOR); // 50,   --> 50

echo $number;

정확한 해결책이 되기엔 너무 쉬운 것 같지만, 나한테는 잘 먹혀요.이 기능을 사용하기 전에 입력 정보를 사용하여 몇 가지 테스트를 수행해야 합니다.

이 코드는 포인트마다 0을 제거하고 소수점 두 자리만 반환합니다.

달러 number=1200.0000달러 number=194.0000.
Str_replace('.00'즉 ,number_format(달러 수, 2,."). str_replace('00'즉, number_format†number, 2,'.',')을 말한다.

출력: 1200

궁극의 솔루션:유일하게 안전한 방법은 regex를 사용하는 것입니다.

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

그것은 어떤 경우에도 통한다

언급URL : https://stackoverflow.com/questions/14531679/remove-useless-zero-digits-from-decimals-in-php

반응형