[ create a new paste ] login | about

Link: http://codepad.org/vzuemJ1D    [ raw code | output | fork ]

PHP, pasted on May 9:
<?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";


Output:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Small numbers crossing zero
 2:  1
 1:  0
 0: -1
-1: -2
-2: -3

Medium numbers
 10203245:  10203244
-10203245: -10203246

Large numbers
 199693823725682700:  199693823725682699
-199693823725682700: -199693823725682701

Ridiculously Large numbers
 98345978934572023478234589573409580359574358258235345350000000000000:  98345978934572023478234589573409580359574358258235345349999999999999
-98345978934572023478234589573409580359574358258235345350000000000000: -98345978934572023478234589573409580359574358258235345350000000000001


Create a new paste based on this one


Comments: