【问题标题】:Id to userfriendly characters用户友好字符的 ID
【发布时间】:2012-09-17 07:59:31
【问题描述】:

我想创建一个用户友好的系统,让用户输入某个id:

id 1-26: A-Z
27: AA
28: AB
    ...
    ...
    ZZZ

我尝试了几种方法来实现这一点,但我得到了随机字符...

$counter = 7;
do {
    $temp = floor($id / (26^$counter)) % 26; 
    $counter--;
    echo($temp.' ');
} while($counter > 0);

【问题讨论】:

标签: php


【解决方案1】:

将 Excel 列名映射到数字顺序有点糟糕,因为 A-Z 中没有 0...

无论如何,我确实想出了两个函数来来回转换它们:

function calcCol($col) //character to number
{
    if(is_numeric($col)) return intval($col);
    $col=array_reverse(str_split(strtoupper(preg_replace("/[^a-z]/i","",$col))));
    $num=0;
    foreach($col as $i=>$ch)
    {
        $num+=(ord($ch)-ord('A')+1)*pow(27,$i);
    }
    $num-=ceil($num/27)-1;
    return $num;
}
function getCol($col) //number to character
{
    if(preg_match("/^[a-z]+$/i",$col)) return strtoupper($col);
    $col=abs(intval($col));
    $col+=ceil($col/26)-1;
    $str="";
    while($col>0)
    {
        $tmp=$col%27;
        $str=chr($tmp-1+ord('A')).$str;
        $col=floor($col/27);
    }
    return $str;
}

解释:

将 A-Z 视为 基于 27 的数字系统,其中缺少/隐藏 0

并且在从字符转换为数字之后,通过计算“计数”了多少个 27 (ceil($num/27)) 来删除那些隐藏的 0s;

在从数字转换为字符之前,通过计算“计数”了多少个 26 (ceil($col/26)),将隐藏的 0s 添加回来。

【讨论】:

    【解决方案2】:

    这是一个碱基转换问题,但有一个小技巧。

    首先,我们将'A' 视为1,因此'AA''AAA' 可能有意义,而'B' 则视为2'C' 视为3..,但@987654329 呢? @?不,'Z' 不是 26,这里的窍门是将'Z' 视为'A0',并且每次在转换时找到0,我们将其记为'Z',并抛出一个@ 987654335@ away(减1)。

    所以我们有以下代码:

    function num2user( $num )
    {
        $s = "ZABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $ret = "";
        while( $num > 0 )
        {
            $m = $num % 26;
            $ret = $s[$m].$ret;
            $num = floor($num / 26);
            if( $m == 0 ) $num = $num - 1;
        }
        return $ret;
    }
    
    for( $i = 1 ; $i < 128 ; $i++ )
    {
        echo "$i=".num2user($i)."\n";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-11
      相关资源
      最近更新 更多