Saya ingin mengubah bilangan bulat menjadi karakter yang setara berdasarkan alfabet. Sebagai contoh:
0 => a
1 => b
2 => c
3 => d
dll. Saya dapat membangun sebuah array dan hanya mencarinya ketika saya membutuhkannya tetapi saya bertanya-tanya apakah ada fungsi bawaan untuk melakukan ini untuk saya. Semua contoh yang saya temukan melalui Google bekerja dengan nilai-nilai ASCII dan bukan posisi karakter dalam alfabet.
javascript
integer
alphabet
VIVA LA NWO
sumber
sumber
Jawaban:
Dengan asumsi Anda ingin huruf kecil:
97 adalah kode ASCII untuk huruf kecil 'a'. Jika Anda ingin huruf besar, ganti 97 dengan 65 (huruf besar 'A'). Perhatikan bahwa jika
n > 25
, Anda akan keluar dari kisaran huruf.sumber
Akan lebih portabel jika memperluas ke huruf lain:
atau, agar lebih kompatibel (dengan IE yang kami cintai):
sumber
String.fromCharCode
menurut saya, seperti yang Anda katakan, itu meluas dengan sangat mudah.[]
pada string.[]
accessor properti pada string didukung pada IE dari IE8 ke atas (IE8 dalam mode compat IE7 juga tidak berfungsi),String.prototype.chatAt
lebih disukai daripada[]
kompatibilitas browser. Misalnya'foo'.charAt(0) == 'f'
[]
accessor properti pada string distandarisasi pada ECMAScript 5 (lihat [[GetOwnProperty]] (P) ).Jika Anda tidak keberatan mendapatkan string multi-karakter kembali, Anda dapat mendukung indeks positif sewenang-wenang:
(Tidak sepenuhnya diuji untuk kesalahan presisi :)
sumber
function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
Jawaban sederhananya adalah (26 karakter):
Jika ruang berharga, Anda dapat melakukan hal berikut (20 karakter):
Pikirkan tentang apa yang dapat Anda lakukan dengan semua byte ekstra itu!
Cara kerjanya adalah Anda mengonversi nomor menjadi basis 36, sehingga Anda memiliki karakter berikut:
Dengan mengimbangi dengan 10 karakter dimulai pada
a
bukan0
.Tidak sepenuhnya yakin tentang seberapa cepat menjalankan dua contoh berbeda sisi klien akan membandingkan.
sumber
String.fromCharCode dari Javascript (code1, code2, ..., codeN) mengambil jumlah argumen yang tak terbatas dan mengembalikan serangkaian huruf yang nilai ASCII terkaitnya adalah code1, code2, ... codeN. Karena 97 adalah 'a' di ASCII, kami dapat menyesuaikan pengindeksan Anda dengan menambahkan 97 ke indeks Anda.
sumber
Saya tidak suka semua solusi yang menggunakan angka ajaib seperti
97
atau36
.ini mengasumsikan huruf besar dan mulai 'A' pada 0.
sumber
Gunakan
String.fromCharCode
. Ini mengembalikan string dari nilai Unicode, yang cocok dengan 128 karakter ASCII pertama.sumber
Ini dia: (a-zA-Z)
input: 0-51, atau itu akan mengembalikan false (range error);
ATAU:
mengembalikan tidak terdefinisi dalam hal kesalahan rentang. CATATAN: array akan dibuat hanya sekali dan karena penutupan itu akan tersedia untuk fungsi codeToChar yang baru. Saya kira ini bahkan lebih cepat daripada metode pertama (itu hanya pencarian pada dasarnya).
sumber
Satu-satunya problemo dengan solusi hebat @ mikemaccana adalah menggunakan binary >> operator yang mahal, kinerja-bijaksana. Saya menyarankan modifikasi ini pada pekerjaan besarnya sebagai sedikit perbaikan yang mungkin bisa dibaca oleh rekan Anda dengan lebih mudah.
Atau sebagai one-liner
Contoh:
sumber
Mencoba
Tampilkan cuplikan kode
sumber
Dengan asumsi Anda ingin huruf besar:
Contoh:
numberToLetter ('023') adalah ["A", "C", "D"]
numberToLetter ('5') adalah "F"
sumber