仅使用字母将数字转换为26base

时间:2017-03-30 15:56:11

标签: php

我需要在“字母”计数系统中转换号码,类似于Excel电子表格:

  

convert(1)==“A”;
  convert(2)==“B”;
  ...
  convert(26)==“Z”;
  convert(27)==“AA”;
  ...
  convert(52)==“AZ”;
  convert(53)==“BA”;
  ...
  convert(702)==“ZZ”;
  convert(703)==“AAA”;

这是我的代码:

function convert($n){
    if ($n> 26) {
        $tmp = floor($n / 26);
        $n= $n % 26;
        $result = chr(($tmp - 1) + 65) . chr(($n - 1) + 65);
    } else {
        $result = chr(($n- 1) + 65);
    }
    return $result;
}

但输出有点偏:

  

@,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W ,X,Y,Z,
  AA,AB,AC,AD,AE,AF,AG,AH,AI,AJ,AK,AL,AM,AN,AO,AP,AQ,AR,AS,AT,AU,AV,AW,AX,AY,
  B @,BA

我试图调整数字,但我无法做到正确,有什么建议可以提供更好的算法吗?

3 个答案:

答案 0 :(得分:2)

利用PHP增加字符串和数字的能力:

function convert($number) {
    $result = 'A';
    for($i = 1; $i < $number; ++$i) {
        ++$result;
    }
    return $result;
}

Demo

答案 1 :(得分:2)

基于@NiettheDarkAbsol评论, 如果预期的呼叫是针对小数字的话,这是一个快速的解决方案:

function convert($n) {
    for($out = 'A'; --$n > 0; $out++);
    return $out;
}

来自docs

  

PHP在处理字符变量而不是C的算术运算时遵循Perl的约定。例如,在PHP和Perl $ a =&#39; Z&#39 ;; $ A ++;将$ a变成'AA&#39;,而在C a =&#39; Z&#39 ;;一个++;变成了&#39; [&#39; (ASCII值为&#39; Z&#39;为90,ASCII值为&#39; [&#39;为91)。请注意,字符变量可以递增但不递减,即使只支持纯ASCII字母和数字(a-z,A-Z和0-9)。递增/递减其他字符变量无效,原始字符串不变。

答案 2 :(得分:0)

您可以尝试这样的事情

<div class="page">
  <div class="container">
    <div class="row">
      <div class="event">Event 1</div>
      <div class="event">Event 2</div>
      <div class="event">Event 3</div>
      <div class="event">Event 4</div>
      <div class="event">Event 5</div>
      <div class="event">Event 6</div>
    </div>
    <div class="row">
      <div class="event">Event 1</div>
      <div class="event">Event 1</div>
      <div class="event">Event 1</div>
    </div>
    <div class="row">
      <div class="event">Event 1</div>
    </div>
    <div class="row">
      <div class="event">Event 1</div>
    </div>
  </div>
</div>

每个循环中的键都是function convert($n) { if ($n <= 0) return ""; $r = ""; $c = "abcdefghijklmnopqrstuvwxyz"; do { $n -= 1; $r = $c[$n % 26] . $r; $n = intval($n / 26); } while($n > 0); return strtoupper($r); } var_dump(convert(703)); // AAA var_dump(convert(52)); // AZ ,因为您使用的数字系统没有零(0)的概念。