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로 수정할 수 없는 것은 없습니다.
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 . ' => ' . (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 . ' => ' . (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
'programing' 카테고리의 다른 글
MariaDB 업데이트 오류 내부 조인 및 선택 (0) | 2022.09.06 |
---|---|
Apache RewriteRule 명령어로 환경변수를 설정할 때 변수 이름 앞에 "REDIRECT_"가 붙는 원인은 무엇입니까? (0) | 2022.09.06 |
switch 문에 열거를 사용하는 Java (0) | 2022.09.06 |
bash에서 .sql 스크립트를 실행하는 방법 (0) | 2022.09.06 |
v-model을 사용하여 Vuex 저장소를 수정하시겠습니까? (0) | 2022.09.06 |