BCCOMM wird beim Übergeben einer nicht numerischen Zeichenfolge versucht, die Zeichenfolge zum Vergleich in eine Zahl zu konvertieren, die der impliziten Umwandlung von schwimmenden Punktzahlen oder Ganzzahlen ähnelt. Das Folgende tritt normalerweise auf:
Die Zeichenfolge beginnt mit einer Zahl, gefolgt von einem nicht numerischen Zeichen: Nur der Öffnungsteil wird als Zahl für den Vergleich angesehen.
Die Zeichenfolge enthält überhaupt keine Zahl: Sie wird mit 0 verarbeitet.
Geben Sie ein Beispiel:
<?php
var_dump(bccomp('123abc', '123')); // Ausgabe 0,Zeigt Gleichheit an,Weil'123abc'Berücksichtigt werden123
var_dump(bccomp('abc', '0')); // Ausgabe 0,'abc'Berücksichtigt werden0
var_dump(bccomp('abc', '1')); // Ausgabe -1,0 < 1
?>
Dieses Verhalten führt sehr wahrscheinlich zu Fehleinschätzungen, wenn es sich um nicht numerische Zeichenfolgen handelt, insbesondere wenn die Zeichenfolge nicht mit einer Zahl beginnt.
Wenn Sie reine numerische Saiten vergleichen müssen, verwenden Sie einfach BCComp . Wenn die Zeichenfolge jedoch nicht numerische Inhalte enthalten kann, wird empfohlen, zuerst die folgenden zu erledigen:
Verwenden Sie regelmäßige oder integrierte PHP-Funktionen wie is_numeric , um zu beurteilen:
<?php
function safe_bccomp($a, $b, $scale = 0) {
if (!is_numeric($a) || !is_numeric($b)) {
throw new InvalidArgumentException("Der Parameter muss eine numerische Zeichenfolge sein");
}
return bccomp($a, $b, $scale);
}
try {
echo safe_bccomp('123abc', '123'); // Wirf eine Ausnahme
} catch (InvalidArgumentException $e) {
echo $e->getMessage();
}
?>
Dies vermeidet den falschen Vergleich von nicht numerischen Zeichenfolgen mit 0.
Wenn die Geschäftslogik es zulässt, können Sie regelmäßig die numerischen Teile in der Zeichenfolge extrahieren und dann vergleichen:
<?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
?>
Diese Methode ist für den Fall geeignet, in dem das Präfix numerische Teile in der Zeichenfolge hat.
BCComp ist für digitale Zeichenfolgen ausgelegt. Wenn nicht numerische Zeichenfolgen übergeben werden, werden sie automatisch in Zahlen umgewandelt, was zu ungenauen Vergleichsergebnissen führen kann.
Vor der Verwendung von BCCOMM wird empfohlen, zu überprüfen, ob die Parameter legale numerische Zeichenfolgen sind.
Wenn eine String, die verglichen werden muss, nicht numerische Inhalte enthalten kann, filtern Sie zuerst Ausnahmen, um Fehleinschätzungen zu vermeiden.
Nur durch angemessene Eingangsüberprüfung und Vorverarbeitung können wir sicherstellen, dass BCCOMM im Vergleich korrekt funktioniert und unerwartete logische Fehler vermeiden.
<?php
// Vergleichen Sie die Nummernteile in der Filterzeichenfolge
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);
}
// Beispiel
echo safe_compare('123abc', '123'); // Ausgabe0
echo safe_compare('abc', '0'); // Ausgabe0
echo safe_compare('abc', '1'); // Ausgabe-1
?>