【问题标题】:Is there any way to show number in letter format in php? [closed]有没有办法在php中以字母格式显示数字? [关闭]
【发布时间】:2014-07-17 12:29:28
【问题描述】:

我正在寻找从任何数字获取字母格式的最短方法。如果,elseif-s,我可以在很多条件下做到这一点,但我需要捷径。

$mynumber=35566693;
$mynumber2=9444333;
echo some_format_function($mynumber).', ';
echo some_format_function($mynumber2);
//result should be something like ABBCCCDA, ABBBCCC

更新:详细说明 - 给定的数字应在以下规则下转换为字母格式: 1.第一个出现的数字应转换为A,第二个为B,第三个为C,依此类推。 2.重复的数字要转换成相同的字母(3453=>ABCA,不是ABCD,不是JKSJ)

【问题讨论】:

  • 您可以创建一个关联数组的查找表,并使用 array_walk 或 array_map 有效地将每个数字“翻译”成一个字符。
  • 数字转字母的规则是什么?
  • 你说的“字母格式”是什么意思
  • 如果您不告诉我们转换的规则是什么,这个问题无法回答
  • 我在示例代码中给出了 2 个示例。没有任何其他条件。我只需要数字字母。

标签: php numbers format


【解决方案1】:

为了在回答之前第一个真正阅读你的问题,试试这个:

function num_to_letter($num) {
    $map = array();
    $letters = str_split("ABCDEFGHIJ"); // ten characters
    return preg_replace_callback("/\d/",function($n) use (&$map,&$letters) {
        $digit = $n[0];
        if( !isset($map[$digit])) $map[$digit] = array_shift($letters);
        return $map[$digit];
    },$num);
}

用法:

echo num_to_letter(3556693); // ABBCCDA

对于更长的数字,将它们作为字符串传递:

echo num_to_letters("1123124648976127846187243232234");
                  // AABCABDEDFGHEABHFDEAFHBDCBCBBCD

【讨论】:

  • 看来,这个比较通用,谢谢
【解决方案2】:
str_replace(
  [0,1,2,3,4,5,6,7,8,9], 
  ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
  $mynumber
);

应该做的伎俩。

UPD 对于本地字母顺序:

$a=[0,1,2,3,4,5,6,7,8,9]; // stub subst array
$l=chr(ord('A')-1);       // first letter
foreach(str_split($mynumber) as $sym) { 
  if(is_int($a[$sym]))    // first meet 
    $a[$sym] = $l = chr(ord($l)+1); 
}
str_replace(              // let’s go
  [0,1,2,3,4,5,6,7,8,9], 
  $a,
  $mynumber
);

【讨论】:

  • 这个简单的方法有一个问题,但是应该先出现“A”,然后是B,然后是C等等。
  • 欧普斯。没有意识到。请参阅更新。
【解决方案3】:

正如你所解释的,你想要的是这样的功能:

<?php
$mynumber=35566693;
$mynumber2=9444333;
$mynumber3=3453;
echo some_format_function($mynumber).', ';
echo some_format_function($mynumber2).', ';
echo some_format_function($mynumber3);

 function some_format_function ($int) {
     $out = '';

     $use = array('A','B','C','D','E','F','G','H','I','J');


     $usedIndex = -1;     

     $mappings = array();

     for ($x =0; $x<strlen($int);++$x) {

         $curChar = substr($int,$x,1);

         if (!isset($mappings[$curChar])) {
            ++$usedIndex;
            $mappings[$curChar]  = $use[$usedIndex];                
         }

         $out .= $mappings[$curChar];


     }
     return $out;
 }

【讨论】:

  • 未按要求执行。试试$mynumber=123456789;,我敢肯定你不会得到所要求的......
  • 是的,我注意到了。我会努力寻找解决方案
  • Niet the Dark Absol,也许你是对的,我没有测试过你给的这样的数字,但在我目前的特殊情况下,4 个不同的字母就足够了,它对他们有用,这就是我选择答案作为解决方案。
  • @Elvin85 我可以根据经验告诉您,最好有一个正常工作的解决方案。尝试使用 12344321 进行测试 - 你会得到 ABCDDABC,而不是 ABCDDCBA ;)
  • @Elvin85 我刚刚更新了它。现在它正在工作。您应该始终在开始时详细说明您想要什么
猜你喜欢
  • 2022-06-12
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2021-02-18
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
相关资源
最近更新 更多