Algorithm to get the excel-like column name of a number

后端 未结 10 1844
囚心锁ツ
囚心锁ツ 2020-11-30 18:08

I\'m working on a script that generate some Excel documents and I need to convert a number into its column name equivalent. For example:

1 => A
2 => B
         


        
相关标签:
10条回答
  • 2020-11-30 18:42

    Combining ircmaxell's recursive answer I've got this one:

    
        function getNameFromNumber($num, $index=0) {
            $index = abs($index*1); //make sure index is a positive integer
            $numeric = ($num - $index) % 26; 
            $letter = chr(65 + $numeric);
            $num2 = intval(($num -$index) / 26);
            if ($num2 > 0) {
                return getNameFromNumber($num2 - 1 + $index) . $letter;
            } else {
                return $letter;
            }
        }
    
    

    I'm using the default indexing as 0 based, but it can be any positive integer for when juggling with arrays in PHP.

    0 讨论(0)
  • 2020-11-30 18:43

    Number convert to Excel column letters:

    /**
     * Number convert to Excel column letters
     * 
     * 1 = A
     * 2 = B
     * 3 = C
     * 27 = AA
     * 1234567789 = CYWOQRM
     * 
     * @link https://vector.cool/php-number-convert-to-excel-column-letters-2
     * 
     * @param int  $num       欄數
     * @param bool $uppercase 大小寫
     * @return void
     */
    function num_to_letters($n)
    {
        $n -= 1;
        for ($r = ""; $n >= 0; $n = intval($n / 26) - 1)
            $r = chr($n % 26 + 0x41) . $r;
        return $r;
    }
    

    ex:

    echo num_to_letters(1);          // A
    echo num_to_letters(2);          // B
    echo num_to_letters(3);          // C
    echo num_to_letters(27);         // AA
    echo num_to_letters(1234567789); // CYWOQRM
    

    Excel column letters convert to Number:

    /**
     * Excel column letters convert to Number
     *
     * A = 1
     * B = 2
     * C = 3
     * AA = 27
     * CYWOQRM = 1234567789
     * 
     * @link https://vector.cool/php-number-convert-to-excel-column-letters-2
     * 
     * @param string $letters
     * @return mixed
     */
    function letters_to_num($a)
    {
        $l = strlen($a);
        $n = 0;
        for ($i = 0; $i < $l; $i++)
            $n = $n * 26 + ord($a[$i]) - 0x40;
        return $n;
    }
    

    ex:

    echo letters_to_num('A');       // 1
    echo letters_to_num('B');       // 2
    echo letters_to_num('C');       // 3
    echo letters_to_num('AA');      // 27
    echo letters_to_num('CYWOQRM'); // 1234567789
    
    0 讨论(0)
  • 2020-11-30 18:43

    To anyone looking for a Javascript implementation of this, here is @ircmaxell's answer in Javascript..

    function getNameFromNumber(num){
        let numeric = num%26;
        let letter = String.fromCharCode(65+numeric);
        let num2 = parseInt(num/26);
        if(num2 > 0) {
          return getNameFromNumber(num2 - 1)+letter;
        } else {
          return letter;
        }
    }
    
    
    0 讨论(0)
  • 2020-11-30 18:45

    Indexed for 1 -> A, 2 -> B, etc

    function numToExcelAlpha($n) {
        $r = 'A';
        while ($n-- > 1) {
            $r++;
        }
        return $r;
    }
    

    Indexed for 0 -> A, 1 -> B, etc

    function numToExcelAlpha($n) {
        $r = 'A';
        while ($n-- >= 1) {
            $r++;
        }
        return $r;
    }
    

    Takes advantage of the fact that PHP follows Perl's convention when dealing with arithmetic operations on character variables and not C's. Note that character variables can be incremented but not decremented.

    0 讨论(0)
提交回复
热议问题