정수를 해당 문자로 변환하십시오. 여기서 0 => a, 1 => b 등


173

알파벳을 기준으로 정수를 해당 문자로 변환하고 싶습니다. 예를 들면 다음과 같습니다.

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

등. 나는 배열을 만들 수 있고 필요할 때 그것을 찾을 수는 있지만 이것을 위해 내장 함수가 있는지 궁금합니다. Google을 통해 찾은 모든 예제는 알파벳의 문자 위치가 아닌 ASCII 값으로 작동합니다.


2
소문자는 알파벳순으로 알파벳 순서로 정렬됩니다.
아논.

13
숫자도 ;-)
mbq

답변:


324

소문자를 원한다고 가정하십시오.

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

97은 소문자 'a'의 ASCII 코드입니다. 대문자를 원하면 97을 65로 바꾸십시오 (대문자 'A'). 인 경우 n > 25글자 범위를 벗어날 수 있습니다.


82

다른 알파벳으로 확장하는 경우 더 이식성이 뛰어납니다.

char='abcdefghijklmnopqrstuvwxyz'[code]

또는 (우리의 사랑하는 IE와의) 더 호환되기 위해 :

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
String.fromCharCode당신이 말했듯이 내 의견 보다 훨씬 우아 합니다. 매우 쉽게 확장됩니다.
Sasha Chedygov

8
확장 할 필요가없는 경우 오류가 발생하기 쉬울 수 있습니까? abcede
넬슨 Rothermel

5
FYI JScript (IE)는 []문자열 에서 인덱스 연산자 를 지원하지 않습니다 .
초승달

4
@Crescent, []문자열 의 속성 접근 자는 IE8부터 IE에서 지원됩니다 (IE7 compat 모드의 IE8도 작동하지 않음) . 브라우저 호환성 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 따라서 코드를 사용하는 사람들은 개행을 고칠 필요가 없습니다. 임의로 줄을 끊을 이유가 없습니다. 편집자는 창의 문자 크기로 줄 바꿈합니다.
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으로 오프셋하면 a대신 문자가 시작됩니다 0.

클라이언트 측의 두 가지 예제를 얼마나 빠르게 실행하는지 비교할 수는 없습니다.


2
나는 당신의 기본 36 창의력을 즐겼습니다
Josh

6

Javascript의 String.fromCharCode (code1, code2, ..., codeN)는 무한한 수의 인수를 사용하여 해당 ASCII 값이 code1, code2, ... codeN 인 문자 문자열을 리턴합니다. ASCII에서 97은 'a'이므로 색인에 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
글쎄, pedantic하기 위해, 그것은 무한한 숫자가 아닌 가변적 인 수의 인수를 취합니다 .
wchargin

4

97또는 같은 마법 번호를 사용하는 모든 솔루션이 마음에 들지 않습니다 36.

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

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

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

대문자로 가정하고 0에서 'A'를 시작합니다.


3

사용하십시오 String.fromCharCode. 이것은 ASCII의 첫 128 문자와 일치하는 유니 코드 값에서 문자열을 리턴합니다.

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 또는 false를 반환합니다 (범위 오류).

또는:

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

범위 오류의 경우 undefined를 반환합니다. 참고 : 배열은 한 번만 생성되며 닫힘으로 인해 새 codeToChar 함수에 사용할 수 있습니다. 나는 그것이 첫 번째 방법보다 훨씬 빠르다고 생각합니다 (기본적으로 조회 일뿐입니다).


그것은 ASCII에서 작동합니다. 알파벳에서 문자의 위치로 작업해야합니다.
VIVA LA NWO

@VIVA-당신이 이것을 해결할 수 있다고 생각합니까? @ Galambalaza-나는 당신이 65가 아닌 64를 원한다고 생각합니다
James Westgate

나는 그것이 얼마나 간단한지를 보여 주었다. 그는 이것을 해결할 수 있었다. 그러나 당신은 간다. 업데이트 참조
gblazex 2016 년

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.