Chuyển đổi số nguyên thành ký tự tương đương, trong đó 0 => a, 1 => b, v.v.


173

Tôi muốn chuyển đổi một số nguyên thành ký tự tương đương dựa trên bảng chữ cái. Ví dụ:

0 => a
1 => b
2 => c
3 => d

v.v. Tất cả các ví dụ tôi tìm thấy qua Google đang làm việc với các giá trị ASCII chứ không phải vị trí của một ký tự trong bảng chữ cái.


2
Các chữ cái viết thường được sắp xếp theo thứ tự abc trong ASCII.
Anon.

13
Ngay cả các chữ số ;-)
mbq

Câu trả lời:


324

Giả sử bạn muốn chữ thường:

var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...

97 là mã ASCII cho chữ thường 'a'. Nếu bạn muốn chữ hoa, thay thế 97 bằng 65 (chữ hoa 'A'). Lưu ý rằng nếu n > 25, bạn sẽ thoát khỏi phạm vi các chữ cái.


82

Sẽ dễ mang theo hơn trong trường hợp mở rộng sang các bảng chữ cái khác:

char='abcdefghijklmnopqrstuvwxyz'[code]

hoặc, để tương thích hơn (với IE yêu quý của chúng tôi):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
Thanh lịch hơn nhiều so với String.fromCharCodeý kiến ​​của tôi, như bạn đã nói, nó mở rộng rất dễ dàng.
Sasha Chedygov

8
Và khi bạn không có nhu cầu gia hạn, có thể dễ bị lỗi hơn? abcede
Nelson Rothermel

5
FYI JScript (IE) không hỗ trợ toán tử chỉ mục []trên chuỗi.
Lưỡi liềm tươi

4
@Crescent, trình truy cập thuộc []tính trên chuỗi được hỗ trợ trên IE từ IE8 trở lên (IE8 ở chế độ compat IE7 cũng không hoạt động), String.prototype.chatAtđược ưu tiên thay vì []tương thích với trình duyệt. Ví dụ:'foo'.charAt(0) == 'f'
CMS

2
@Crescent, quên đề cập rằng trình truy cập thuộc []tính trên chuỗi được chuẩn hóa trên ECMAScript 5 (xem [[GetOwnProperty]] (P) ).
CMS

29

Nếu bạn không phiền khi lấy lại chuỗi nhiều ký tự, bạn có thể hỗ trợ các chỉ số tích cực tùy ý:

function idOf(i) {
    return (i >= 26 ? idOf((i / 26 >> 0) - 1) : '') +  'abcdefghijklmnopqrstuvwxyz'[i % 26 >> 0];
}

idOf(0) // a
idOf(1) // b
idOf(25) // z
idOf(26) // aa
idOf(27) // ab
idOf(701) // zz
idOf(702) // aaa
idOf(703) // aab

(Không được kiểm tra kỹ lưỡng cho các lỗi chính xác :)


1
Hàm đệ quy, rất đẹp!
John Virgolino

@mikemaccana, tại sao chỉnh sửa này? Tôi nghĩ rằng nó làm cho nó khó đọc hơn. Bây giờ tôi phải cuộn theo chiều ngang để đọc mã.
z0r

@ z0r Vì vậy, những người sử dụng mã sẽ không phải sửa dòng mới. Không có lý do để ngắt dòng tùy ý, các biên tập viên sẽ bọc ở kích thước ký tự của cửa sổ của họ.
mikemaccana

Điều này làm việc tuyệt vời, có một biến thể để làm ngược lại?
Ethannn

Ý tưởng tuyệt vời, nhưng nó đã không hoạt động cho đến khi thay đổi thành điều này:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL

19

Một câu trả lời đơn giản sẽ là (26 ký tự):

String.fromCharCode(97+n);

Nếu không gian là quý giá, bạn có thể làm như sau (20 ký tự):

(10+n).toString(36);

Hãy suy nghĩ về những gì bạn có thể làm với tất cả các byte bổ sung!

Cách thức hoạt động của việc này là bạn chuyển đổi số thành cơ sở 36, do đó bạn có các ký tự sau:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

Bằng cách bù đắp 10, các ký tự bắt đầu athay vì 0.

Mặc dù không hoàn toàn chắc chắn về việc chạy nhanh hai ví dụ khác nhau mà phía khách hàng sẽ so sánh.


2
Tôi rất thích sự sáng tạo cơ sở 36 của bạn
Josh

6

String.fromCharCode của Javascript (code1, code2, ..., codeN) nhận vô số đối số và trả về một chuỗi các chữ cái có giá trị ASCII tương ứng là code1, code2, ... codeN. Vì 97 là 'a' trong ASCII, chúng tôi có thể điều chỉnh để lập chỉ mục của bạn bằng cách thêm 97 vào chỉ mục của bạn.

function indexToChar(i) {
  return String.fromCharCode(i+97); //97 in ASCII is 'a', so i=0 returns 'a', 
                                    // i=1 returns 'b', etc
}

4
Vâng, để được pedantic, phải mất một biến số đối số, không phải là một vô hạn số lượng.
wchargein

4

Tôi không thích tất cả các giải pháp sử dụng số ma thuật như 97hay 36.

const A = 'A'.charCodeAt(0);

let numberToCharacter = number => String.fromCharCode(A + number);

let characterToNumber = character => character.charCodeAt(0) - A;

điều này giả sử các chữ cái viết hoa và bắt đầu 'A' ở 0.


3

Sử dụng String.fromCharCode. Điều này trả về một chuỗi từ một giá trị Unicode, khớp với 128 ký tự đầu tiên của ASCII.

var a = String.fromCharCode(97);

3

Ở đó bạn đi: (a-zA-Z)

function codeToChar( number ) {
  if ( number >= 0 && number <= 25 ) // a-z
    number = number + 97;
  else if ( number >= 26 && number <= 51 ) // A-Z
    number = number + (65-26);
  else
    return false; // range error
  return String.fromCharCode( number );
}

đầu vào: 0-51, hoặc nó sẽ trả về false (lỗi phạm vi);

HOẶC LÀ:

var codeToChar = function() {
  var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
  return function( code ) {
    return abc[code];
  };
})();

trả về không xác định trong trường hợp lỗi phạm vi. LƯU Ý: mảng sẽ chỉ được tạo một lần và vì đóng, nó sẽ có sẵn cho hàm codeToChar mới. Tôi đoán nó thậm chí còn nhanh hơn phương pháp đầu tiên (về cơ bản nó chỉ là một tra cứu).


Điều đó làm việc với ASCII, tôi cần làm việc với vị trí của nhân vật trong bảng chữ cái.
VIVA LA NWO

@VIVA - Tôi nghĩ bạn có thể đã làm việc này? @Galambalaza - Tôi nghĩ bạn muốn 65 chứ không phải 64
James Westgate

tôi chỉ cho thấy nó đơn giản như thế nào anh ấy đã có thể làm việc này. nhưng có bạn đi. xem bản cập nhật
gblazex

1

Vấn đề duy nhất với giải pháp tuyệt vời của @ mikemaccana là nó sử dụng toán tử nhị phân >> rất tốn kém, hiệu quả. Tôi đề nghị sửa đổi này cho công việc tuyệt vời của anh ấy như là một cải tiến nhỏ mà các đồng nghiệp của bạn có thể có thể đọc dễ dàng hơn.

const getColumnName = (i) => {
     const previousLetters = (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '');
     const lastLetter = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; 
     return previousLetters + lastLetter;
}

Hoặc như một lớp lót

const getColumnName = i => (i >= 26 ? getColumnName(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26];

Thí dụ:

getColumnName(0); // "A"
getColumnName(1); // "B"
getColumnName(25); // "Z"
getColumnName(26); // "AA"
getColumnName(27); // "AB"
getColumnName(80085) // "DNLF"


-3

Giả sử bạn muốn chữ hoa viết thường:

function numberToLetter(num){
        var alf={
            '0': 'A', '1': 'B', '2': 'C', '3': 'D', '4': 'E', '5': 'F', '6': 'G'
        };
        if(num.length== 1) return alf[num] || ' ';
        return num.split('').map(numberToLetter);
    }

Thí dụ:

numberToLetter ('023')["A", "C", "D"]

numberToLetter ('5')"F"

chức năng số đến chữ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.