<?php
function decrement_string ($str) {
// 1 and 0 are special cases with this method
if ($str == 1 || $str == 0) return (string) ($str - 1);
// Determine if number is negative
$negative = $str[0] == '-';
// Strip sign and leading zeros
$str = ltrim($str, '0-+');
// Loop characters backwards
for ($i = strlen($str) - 1; $i >= 0; $i--) {
if ($negative) { // Handle negative numbers
if ($str[$i] < 9) {
$str[$i] = $str[$i] + 1;
break;
} else {
$str[$i] = 0;
}
} else { // Handle positive numbers
if ($str[$i]) {
$str[$i] = $str[$i] - 1;
break;
} else {
$str[$i] = 9;
}
}
}
return ($negative ? '-' : '').ltrim($str, '0');
}
echo "Small numbers crossing zero\n"
. " 2: ".decrement_string("2")."\n"
. " 1: ".decrement_string("1")."\n"
. " 0: ".decrement_string("0")."\n"
. "-1: ".decrement_string("-1")."\n"
. "-2: ".decrement_string("-2")."\n"
. "\n"
. "Medium numbers\n"
. " 10203245: ".decrement_string("10203245")."\n"
. "-10203245: ".decrement_string("-10203245")."\n"
. "\n"
. "Large numbers\n"
. " 199693823725682700: ".decrement_string("199693823725682700")."\n"
. "-199693823725682700: ".decrement_string("-199693823725682700")."\n"
. "\n"
. "Ridiculously Large numbers\n"
. " 98345978934572023478234589573409580359574358258235345350000000000000: ".decrement_string("98345978934572023478234589573409580359574358258235345350000000000000")."\n"
. "-98345978934572023478234589573409580359574358258235345350000000000000: ".decrement_string("-98345978934572023478234589573409580359574358258235345350000000000000")."\n";