我查看了文檔,甚至偷看了C源代碼,我看不出爲什麼他們將可接受的基數限制爲2..36。有人知道嗎?爲什麼Ruby中的FixNum#to_s方法只接受2到36的基數?
回答
正如其他人所指出的,麥冬< 2是麻煩的渲染。而且對於大於['0','9'] + ['a','z']的基數,使用什麼字符沒有常規協議,這就是爲什麼標準方法不支持超出這些限制的基數。
如果你真的想要一個自定義的基數表示,你需要定義符號的字母來使用的數字。這裏有一個小模塊,可以給你這個能力。
module CustomRadix
# generate string representation of integer, using digits from custom alphabet
# [val] a value which can be cast to integer
# [digits] a string or array of strings representing the custom digits
def self.custom_radix val, digits
digits = digits.to_a unless digits.respond_to? :[]
radix = digits.length
raise ArgumentError, "radix must have at least two digits" if radix < 2
i = val.to_i
out = []
begin
rem = i % radix
i /= radix
out << digits[rem..rem]
end until i == 0
out.reverse.join
end
# can be used as mixin, eg class Integer; include CustomRadix; end
# 32.custom_radix('abcd') => "caa" (200 base 4) equiv to 32.to_s(4).tr('0123','abcd')
def custom_radix digits
CustomRadix.custom_radix self, digits
end
end
實例的使用:
$ irb
>> require '~/custom_radix'
=> true
>> CustomRadix.custom_radix(12345,'0'..'9')
=> "12345"
>> CustomRadix.custom_radix(12345,'.-')
=> "--......---..-"
>> funny_hex_digits = ('0'..'9').to_a + ('u'..'z').to_a
=> ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "u", "v", "w", "x", "y", "z"]
>> CustomRadix.custom_radix(255, funny_hex_digits)
=> "zz"
>> class Integer; include CustomRadix; end
=> Integer
>> (2**63).custom_radix(funny_hex_digits)
=> "8000000000000000"
>> (2**64+2**63+2**62).custom_radix(funny_hex_digits)
=> "1w000000000000000"
>> base64_digits = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a << '+' << '/'
=> ["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", "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", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "/"]
>> 123456.custom_radix(base64_digits)
=> "eJA"
我不知道紅寶石什麼,但我知道有10個十進制數字加上26個字母數字。這是36.
這當然可能是原因,但如果區分大小寫,則有46個字母數字字符。這實際上是因爲我想要生成一組46個字符的隨機31個字符的字符串,並且對此產生了「31.times.inject(''){| i |我<< rand(46).to_s(46)}'不起作用。 – 2012-03-22 17:44:30
@sidewaysmilk但是十六進制數字幾乎普遍不區分大小寫,並且改變高位基數會非常不一致。 – delnan 2012-03-22 17:48:41
然後,我建議你使用base-64編碼。 – BlueMonkMN 2012-03-22 17:49:14
你將如何渲染基數爲1的數字?你將如何渲染基數爲37的數字?在基地300?
對於十六進制數字,通常使用0..9和A..F。繼續使用字母表代替更高的基數是直觀的,但這隻能讓你達到36個。由於基數較少的用途(如果有的話 - 我從未見過),除此之外沒有任何約定。除了基地64,這是一個非常不同的野獸,特定於一個基地,而不是非常老。此外,還有一個巨大的不兼容變體,這隻會加強我的觀點。基礎1:存在一元計數,但它不是非常有用,甚至在計算中不太常見,並且很容易模擬(只是相同字符的concat n
次)。此外,人們可能對該角色應該是什麼有着截然不同的意見。
- 1. 4.to_s(2)中的整數2在Ruby中做了什麼?
- 2. 爲什麼我的to_s方法在ruby中返回0?
- 3. 爲什麼Erlang數字中的基數有2..36的任意限制?
- 4. 爲什麼不是put方法調用我的.to_s方法?
- 5. 未定義的方法`symbolize_keys!'爲2:Fixnum
- 6. Ruby:私人方法3:Fixnum
- 7. Ruby - undefined方法`fdiv'爲0:Fixnum
- 8. 爲什麼UIComponent中的encodeXxx方法接受FacesContext參數?
- 9. 爲什麼方法redirect()只接受grails 2.5.x的一個參數
- 10. 爲什麼compareTo()中的參數不接受類名,而只接受Object?
- 11. Ruby中`Fixnum`和`3`有什麼不同?
- 12. 爲什麼方法'Arrays.asList()'不接受{「」,「」}類型的參數,但接受(「」,「」)?
- 13. Ruby:未定義的方法`數字'爲3212:Fixnum(NoMethodError)
- 14. 爲什麼方法表只包含基類的虛方法?
- 15. 爲什麼PartialFunction中沒有orElse方法接受全部函數?
- 16. 什麼是def to_s函數?
- 17. 爲什麼ScheduledThreadPoolExecutor只接受固定數量的線程?
- 18. 在Ruby中實現to_s的數組to_lod
- 19. Ruby /葫蘆:未定義方法`each'for 2:Fixnum(NoMethodError)
- 20. 爲什麼對象類中的方法受到保護?
- 21. 爲什麼Java main()方法接受一個String args數組?
- 22. Ruby方法可以接受二維數組作爲參數嗎?
- 23. AlertDialog.Builder(Context context)爲什麼只接受Activity作爲參數?
- 24. 爲什麼Ruby將FixNum n散列爲2n + 1?
- 25. Rails.cache.fetch * .to_s做什麼?
- 26. 在Java中處理未接受方法參數的最佳方法是什麼?
- 27. 爲什麼Ruby不會自動執行to_s?
- 28. 爲什麼python dict的fromkeys方法可以接受列表作爲參數?
- 29. 未定義的方法`收集'爲2:Fixnum
- 30. 爲什麼我使用NDB的`populate()`不接受`id`或`parent`,而只接受`key`?
@muistooshort基地1存在,做過一個理貨清單?還是計算一些測試跑步者爲成功測試產生的點數?對於這個問題,可能有一個基地'1/2'和更瘋狂的東西(基地'phi'任何人?)。 – delnan 2012-03-22 17:46:37