숫자가 아닌 문자열을 통과 할 때 BCComp는 부동 소수점 번호 또는 정수의 암시 적 변환과 유사한 비교를 위해 문자열을 숫자로 변환하려고합니다. 다음은 일반적으로 발생합니다.
문자열은 숫자로 시작하고 숫자가 아닌 문자가 이어집니다. 개구부 부분 만 비교를위한 숫자로 간주됩니다.
문자열에는 숫자가 전혀 포함되어 있지 않습니다. 0으로 처리됩니다.
예를 들어 :
<?php
var_dump(bccomp('123abc', '123')); // 산출 0,평등을 나타냅니다,왜냐하면'123abc'고려 중123
var_dump(bccomp('abc', '0')); // 산출 0,'abc'고려 중0
var_dump(bccomp('abc', '1')); // 산출 -1,0 < 1
?>
이 동작은 숫자가 아닌 문자열을 다룰 때, 특히 문자열이 숫자로 시작하지 않을 때 잘못 판단 할 가능성이 높습니다.
순수한 숫자 문자열을 비교 해야하는 경우 BCComp를 사용하십시오. 그러나 문자열에 숫자가 아닌 컨텐츠가 포함될 수있는 경우 다음을 먼저 수행하는 것이 좋습니다.
IS_NUMERIC 과 같은 PHP 일반 또는 내장 기능을 사용하여 판단하십시오.
<?php
function safe_bccomp($a, $b, $scale = 0) {
if (!is_numeric($a) || !is_numeric($b)) {
throw new InvalidArgumentException("매개 변수는 숫자 문자열이어야합니다");
}
return bccomp($a, $b, $scale);
}
try {
echo safe_bccomp('123abc', '123'); // 예외를 던지십시오
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}
?>
이는 비 숫자 문자열을 0으로 잘못 비교하는 것을 피합니다.
비즈니스 로직이 허용되면 정기적으로 사용하여 문자열에서 숫자 부품 만 추출 한 다음 비교할 수 있습니다.
<?php
function extract_numeric($str) {
preg_match('/^[+-]?(\d+)(\.\d+)?/', $str, $matches);
return $matches[0] ?? '0';
}
$a = extract_numeric('123abc');
$b = extract_numeric('123');
echo bccomp($a, $b); // 0
?>
이 방법은 접두사에 문자열에 숫자 부품이있는 경우에 적합합니다.
BCComp 는 디지털 문자열 용으로 설계되었습니다. 숫자가 아닌 문자열이 통과되면 자동으로 숫자로 변환되어 부정확 한 비교 결과가 발생할 수 있습니다.
BCComp를 사용하기 전에 매개 변수가 합법적 인 숫자 문자열인지 확인하는 것이 좋습니다.
비교 해야하는 문자열에 비 언어 컨텐츠, 필터 또는 던지기 예외가 포함될 수 있습니다.
합리적인 입력 검증 및 전처리를 통해서만 BCComp가 비교하여 올바르게 성능을 발휘하고 예기치 않은 논리 오류를 피할 수 있습니다.
<?php
// 필터 문자열의 숫자 부품을 비교하십시오
function safe_compare($a, $b, $scale = 0) {
preg_match('/^[+-]?(\d+)(\.\d+)?/', $a, $matchA);
preg_match('/^[+-]?(\d+)(\.\d+)?/', $b, $matchB);
$numA = $matchA[0] ?? '0';
$numB = $matchB[0] ?? '0';
return bccomp($numA, $numB, $scale);
}
// 예
echo safe_compare('123abc', '123'); // 산출0
echo safe_compare('abc', '0'); // 산출0
echo safe_compare('abc', '1'); // 산출-1
?>