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
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.
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
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;
}
}
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.