将整数转换为26进制,使用a到z作为数字。

4

我需要实现一个十进制转字符的转换器。我有26个字符可用,因此需要将整数转换为26进制系统,然后将每个数字更改为其字母对应项。最终结果字符串中不要使用数字0-9。我可以使用to_s()方法来实现:

82.to_s(26)  #=> "34" / which gives me "de"
120.to_s(26)  #=> "4g" / which should give me "aep", but it's not

Ruby的to_s()方法返回的值并不太有用。数字82可以成功转换,但是数字120的转换结果让我无从处理。
请问有人能解释一下如何让数字120(以此为例)转换为等价的aep吗?换句话说,如何将十进制转换为26进制但输出时不使用数字?

2
我不确定你为什么期望120的"aep"?在26进制中,120必须只有两个符号。我得到的结果是"eq"。 - Neil Slater
你说你展示了你使用的是 to_i,但是你的代码实际上使用的是 to_s。我不知道你在写什么。 - sawa
对不起,那是一个打字错误。 - mbajur
你应该更加小心。还有一个剩下。 - sawa
很抱歉,事实上我基于别人的计算提出了这个问题,但我完全不理解。所以一切都很混乱,我不知道自己在写什么或者在问什么。感谢您的耐心。再也不会写关于我一无所知的东西了! - mbajur
1个回答

14

Ruby的Fixnum#to_s(base)String#to_i(base)用于表示不同进制的数字。虽然它们不能使用任意字符,但它们被设计为与十六进制和base64等约定相兼容。

如果你不是将其转换为其他进制,而只是将十进制数字编码为字母,然后再进行转换,那么一个简单的替换就足够了:

46.to_s.tr( "0123456789", "abcdefghijk" )
=> "eg"

"eg".tr( "abcdefghijk", "0123456789" ).to_i
=> 46

因此,如果您想要同时做到这两点,并且使用a-z来表示您在26进制中的数字:

46.to_s(26).tr( "0123456789abcdefghijklmnopq", "abcdefghijklmnopqrstuvwxyz" )
=> "bu"

"bu".tr( "abcdefghijklmnopqrstuvwxyz", "0123456789abcdefghijklmnopq" ).to_i(26)
=> 46

是的,大致上是这样,但源数制不应该是十进制,而应该是26进制。 - mbajur
在这种情况下,首先要转换为26进制 - 我会举个例子。 - Neil Slater
好的,看起来我在解释我想要实现什么方面有问题 :( 基本上 - 我已经在纸上完成了这个计算,并将十进制基数120转换为26,得到了等于aep的数字(120%26 = 16(它是p),120/26 = 4,这都给出了'aep')。这对你有任何意义吗? - mbajur
1
不,这没有意义,"a" 从哪里来的? - Neil Slater
2
请注意,在此系统中,“a”代表“0”,因此无论您是否在字符串前面添加“a”,都没有任何区别,应将其省略。字符“a”不应出现在最左边的位置。 - sawa
我的计算有误。我还忘记了 a 代表 0 并且是可选的。 - mbajur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接