แปลงจำนวนเต็มเป็นอักขระเทียบเท่าโดยที่ 0 => a, 1 => b เป็นต้น


173

ฉันต้องการแปลงจำนวนเต็มเป็นตัวละครที่เท่ากันตามตัวอักษร ตัวอย่างเช่น:

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

เป็นต้นฉันสามารถสร้างอาร์เรย์และค้นหามันเมื่อฉันต้องการมัน แต่ฉันสงสัยว่ามีฟังก์ชั่นในตัวที่ทำสิ่งนี้ให้ฉันหรือไม่ ตัวอย่างทั้งหมดที่ฉันพบผ่านทาง Google นั้นใช้งานได้กับค่า ASCII ไม่ใช่ตำแหน่งของตัวอักษรในตัวอักษร


2
อักษรตัวพิมพ์เล็กเรียงตามลำดับตัวอักษรใน ASCII
อานนท์

13
แม้ตัวเลข ;-)
mbq

คำตอบ:


324

สมมติว่าคุณต้องการตัวอักษรพิมพ์เล็ก:

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

97 คือรหัส ASCII สำหรับตัวพิมพ์เล็ก 'a' หากคุณต้องการตัวอักษรตัวพิมพ์ใหญ่ให้แทนที่ 97 ด้วย 65 (ตัวพิมพ์ใหญ่ 'A') โปรดทราบว่าหากn > 25คุณจะออกนอกช่วงตัวอักษร


82

จะพกพาได้มากกว่าในกรณีที่ขยายไปยังตัวอักษรอื่น:

char='abcdefghijklmnopqrstuvwxyz'[code]

หรือเพื่อให้เข้ากันได้มากขึ้น (กับ IE อันเป็นที่รักของเรา):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
สง่างามยิ่งกว่าString.fromCharCodeความคิดของฉันอย่างที่คุณพูดมันขยายได้อย่างง่ายดายมาก
Sasha Chedygov

8
และเมื่อคุณไม่ต้องการขยายอาจมีแนวโน้มที่จะเกิดข้อผิดพลาดมากขึ้นหรือไม่ abcede
Nelson Rothermel

5
FYI JScript (IE) ไม่รองรับตัวดำเนินการดัชนี[]กับสตริง
Crescent Fresh

4
@Crescent ตัวเข้าถึง[]คุณสมบัติบนสตริงได้รับการสนับสนุนบน IE จาก IE8 ขึ้นไป (IE8 ในโหมดที่เข้ากัน IE7 ยังใช้งานไม่ได้) String.prototype.chatAtเป็นที่ต้องการมากกว่า[]สำหรับความเข้ากันได้ของเบราว์เซอร์ เช่น'foo'.charAt(0) == 'f'
CMS

2
@Crescent ลืมที่จะพูดถึงว่าตัวเข้าถึง[]คุณสมบัติบนสตริงนั้นเป็นมาตรฐานใน ECMAScript 5 (ดู[[GetOwnProperty]] (P )
CMS

29

หากคุณไม่สนใจที่จะได้รับสายอักขระหลายตัวกลับมาคุณสามารถรองรับดัชนีบวกได้เอง:

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

(ไม่ผ่านการทดสอบอย่างละเอียดเพื่อหาข้อผิดพลาดที่มีความแม่นยำ :)


1
ฟังก์ชั่นวนซ้ำดีมาก!
John Virgolino

@mikemaccana ทำไมการแก้ไขนี้ ฉันคิดว่ามันทำให้อ่านยากขึ้น ตอนนี้ฉันต้องเลื่อนแนวนอนเพื่ออ่านรหัส
z0r

@ z0r ดังนั้นผู้ใช้รหัสจะไม่ต้องแก้ไข newline ไม่มีเหตุผลใดที่จะทำให้เส้นแตกโดยพลการบรรณาธิการจะตัดตามขนาดตัวอักษรของหน้าต่าง
mikemaccana

มันใช้งานได้ดีมีตัวแปรให้ทำตรงกันข้ามไหม?
Ethannn

เป็นความคิดที่ดี แต่มันไม่ได้ผลจนกว่าจะเปลี่ยนเป็น:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
PatrickvL

19

คำตอบง่ายๆคือ (26 ตัวอักษร):

String.fromCharCode(97+n);

หากช่องว่างมีค่าคุณสามารถทำสิ่งต่อไปนี้ (20 ตัวอักษร):

(10+n).toString(36);

คิดเกี่ยวกับสิ่งที่คุณสามารถทำได้กับไบต์พิเศษเหล่านั้นทั้งหมด!

วิธีการทำงานคือคุณแปลงตัวเลขเป็นเบส 36 ดังนั้นคุณจึงมีอักขระต่อไปนี้:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

โดยหักจาก 10 ตัวอักษรเริ่มต้นที่แทนa0

ไม่แน่ใจทั้งหมดเกี่ยวกับความรวดเร็วในการเรียกใช้ตัวอย่างสองตัวอย่างที่แตกต่างกันระหว่างฝั่งไคลเอ็นต์


2
ฉันสนุกกับฐานสร้างสรรค์ 36 ของคุณ
Josh

6

String.fromCharCode ของ Javascript (code1, code2, ... , codeN) ใช้จำนวนอาร์กิวเมนต์ที่ไม่สิ้นสุดและส่งคืนสตริงของตัวอักษรที่มีค่า ASCII ที่สอดคล้องกันคือ code1, code2, ... codeN เนื่องจาก 97 คือ 'a' ใน ASCII เราสามารถปรับเปลี่ยนการจัดทำดัชนีของคุณโดยเพิ่ม 97 ลงในดัชนีของคุณ

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

4
ดีที่จะอวดความรู้ก็จะใช้เวลาตัวแปรจำนวนข้อโต้แย้งไม่ได้เป็นอนันต์จำนวน
wchargin

4

ฉันไม่ชอบโซลูชันทั้งหมดที่ใช้หมายเลขเวทย์มนตร์เช่น97หรือ36หรือ

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

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

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

นี่ถือว่าตัวอักษรตัวใหญ่และเริ่ม 'A' ที่ 0


3

String.fromCharCodeใช้ ส่งคืนสตริงจากค่า Unicode ซึ่งตรงกับอักขระ 128 ตัวแรกของ ASCII

var a = String.fromCharCode(97);

3

ไปแล้ว: (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 );
}

อินพุต: 0-51 หรือมันจะส่งกลับเท็จ (ช่วงข้อผิดพลาด);

หรือ:

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

ส่งคืนค่าไม่ได้กำหนดในกรณีของข้อผิดพลาดช่วง หมายเหตุ: อาร์เรย์จะถูกสร้างขึ้นเพียงครั้งเดียวและเนื่องจากการปิดมันจะมีให้สำหรับฟังก์ชั่น codeToChar ใหม่ ฉันเดาว่ามันเร็วกว่านั้นเป็นวิธีแรก (เป็นเพียงการค้นหาทั่วไป)


ใช้งานได้กับ ASCII ฉันต้องทำงานกับตำแหน่งของตัวละครในตัวอักษร
VIVA LA NWO

@VIVA - ฉันคิดว่าคุณสามารถทำสิ่งนี้ได้หรือไม่ @Galambalaza - ฉันคิดว่าคุณต้องการ 65 ไม่ใช่ 64
James Westgate

ฉันเพิ่งแสดงให้เห็นว่ามันง่าย เขาสามารถทำสิ่งนี้ได้ แต่คุณไป ดูการปรับปรุง
gblazex

1

ปัญหาเดียวที่มีทางออกที่ยอดเยี่ยมของ @ mikemaccana คือมันใช้ตัวดำเนินการไบนารี่ >> ซึ่งคุ้มค่าและชาญฉลาด ฉันขอแนะนำการดัดแปลงนี้เพื่องานที่ยอดเยี่ยมของเขาเป็นการปรับปรุงเล็กน้อยที่เพื่อนร่วมงานของคุณอาจอ่านได้ง่าย

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

หรือว่าเป็นซับเดียว

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

ตัวอย่าง:

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


-3

สมมติว่าคุณต้องการตัวอักษรพิมพ์ใหญ่:

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);
    }

ตัวอย่าง:

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

numberToLetter ('5')คือ"F"

จำนวนฟังก์ชั่นตัวอักษร

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.