현재 위치: > 최신 기사 목록> BCComp를 사용하여 숫자가 아닌 문자열을 비교할 때 어떻게됩니까?

BCComp를 사용하여 숫자가 아닌 문자열을 비교할 때 어떻게됩니까?

gitbox 2025-05-31

BCComp를 사용하여 비수막 문자열의 동작을 비교합니다

숫자가 아닌 문자열을 통과 할 때 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를 사용하십시오. 그러나 문자열에 숫자가 아닌 컨텐츠가 포함될 수있는 경우 다음을 먼저 수행하는 것이 좋습니다.

1. 문자열이 유효한 숫자 형식인지 확인

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으로 잘못 비교하는 것을 피합니다.

2. 필터 또는 깨끗한 문자열, 숫자 부품 만 유지하십시오.

비즈니스 로직이 허용되면 정기적으로 사용하여 문자열에서 숫자 부품 만 추출 한 다음 비교할 수 있습니다.

 <?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
?>