我需要实现一个十进制到字符转换器。我有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但不在输出中使用数字?
答案 0 :(得分:12)
Ruby的Fixnum#to_s( base )
和String#to_i( base )
用于表示不同基数的数字。你不能使用随意的字符,它们被设计成与hex和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