我們可以使用模和輸入的長度。用最後一個字符 來計算確切的「位置」,剩下的要計數 我們在字母表中做了多少「圈數」,例如:
def column_to_integer(column_name)
letters = /[A-Z]+/.match(column_name).to_s.split("")
laps = (letters.length - 1) * 26
position = ((letters.last.ord - 'A'.ord) % 26)
laps + position
end
使用十進制表示(ord
)和數學技巧起初似乎是一個整潔的 的解決方案,但它對於 執行一些痛點。我們有神奇的數字,26
,和常量'A'.ord
所有 結束。
一個解決方案是讓我們的代碼更好地瞭解我們的域名,即 的字母表。在這種情況下,我們可以將的最後一個字符的位置(因爲它已經在基於零的陣列中排序)(例如,
ALPHABET = ('A'..'Z').to_a
def column_to_integer(column_name)
letters = /[A-Z]+/.match(column_name).to_s.split("")
laps = (letters.length - 1) * ALPHABET.size
position = ALPHABET.index(letters.last)
laps + position
end
最終結果:
> column_to_integer('F5')
=> 5
> column_to_integer('AK14')
=> 36
HTH。最好!
任何人都可以投票結束這個問題給我任何想法爲什麼建議它。這並不是最受歡迎的反應。我不知道有什麼理由,這肯定並不意味着我不會誤會。如果你不讓我知道我被拒絕的原因是什麼,我最有可能一遍又一遍地重複同樣的錯誤。感謝您考慮以更多的敘述方式與我溝通:) – gorn
對於那些對這個問題本身感興趣的人 - 我嘗試過將某個字母部分視爲基於36的數字,並從中減去99A並將其轉換爲十進制(雖然它被視爲基於26的數字),它幾乎工作,但不完全。 – gorn
我目前遇到的醜陋解決方案是'colname = colname.rjust(3,'@'); col =(colname [-1] .ord-64)+(colname [-2] .ord-64)* 26 +(colname [-3] .ord-64)* 26 * 26'其中colname是列座標。 – gorn