알파벳을 기준으로 정수를 해당 문자로 변환하고 싶습니다. 예를 들면 다음과 같습니다.
0 => a
1 => b
2 => c
3 => d
등. 나는 배열을 만들 수 있고 필요할 때 그것을 찾을 수는 있지만 이것을 위해 내장 함수가 있는지 궁금합니다. Google을 통해 찾은 모든 예제는 알파벳의 문자 위치가 아닌 ASCII 값으로 작동합니다.
알파벳을 기준으로 정수를 해당 문자로 변환하고 싶습니다. 예를 들면 다음과 같습니다.
0 => a
1 => b
2 => c
3 => d
등. 나는 배열을 만들 수 있고 필요할 때 그것을 찾을 수는 있지만 이것을 위해 내장 함수가 있는지 궁금합니다. Google을 통해 찾은 모든 예제는 알파벳의 문자 위치가 아닌 ASCII 값으로 작동합니다.
답변:
소문자를 원한다고 가정하십시오.
var chr = String.fromCharCode(97 + n); // where n is 0, 1, 2 ...
97은 소문자 'a'의 ASCII 코드입니다. 대문자를 원하면 97을 65로 바꾸십시오 (대문자 'A'). 인 경우 n > 25
글자 범위를 벗어날 수 있습니다.
다른 알파벳으로 확장하는 경우 더 이식성이 뛰어납니다.
char='abcdefghijklmnopqrstuvwxyz'[code]
또는 (우리의 사랑하는 IE와의) 더 호환되기 위해 :
char='abcdefghijklmnopqrstuvwxyz'.charAt(code);
String.fromCharCode
당신이 말했듯이 내 의견 보다 훨씬 우아 합니다. 매우 쉽게 확장됩니다.
[]
문자열 에서 인덱스 연산자 를 지원하지 않습니다 .
[]
문자열 의 속성 접근 자는 IE8부터 IE에서 지원됩니다 (IE7 compat 모드의 IE8도 작동하지 않음) . 브라우저 호환성 String.prototype.chatAt
대신 선호됩니다 []
. 예'foo'.charAt(0) == 'f'
[]
문자열 의 속성 접근자가 ECMAScript 5에서 표준화되어 있음을 언급하지 않았습니다 ( [[GetOwnProperty]] (P) 참조 ).
다중 문자 문자열을 다시 가져와도 괜찮다면 임의의 양의 인덱스를 지원할 수 있습니다.
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
(정밀 오류에 대해 철저히 테스트되지 않았습니다.)
function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
간단한 대답은 (26 자)입니다.
String.fromCharCode(97+n);
공간이 소중한 경우 다음 (20 자)을 수행 할 수 있습니다.
(10+n).toString(36);
여분의 바이트로 무엇을 할 수 있는지 생각해보십시오!
이 방법은 숫자를 밑수 36으로 변환하므로 다음 문자가 있습니다.
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
문자를 10으로 오프셋하면 a
대신 문자가 시작됩니다 0
.
클라이언트 측의 두 가지 예제를 얼마나 빠르게 실행하는지 비교할 수는 없습니다.
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
}
사용하십시오 String.fromCharCode
. 이것은 ASCII의 첫 128 문자와 일치하는 유니 코드 값에서 문자열을 리턴합니다.
var a = String.fromCharCode(97);
당신은 간다 : (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 함수에 사용할 수 있습니다. 나는 그것이 첫 번째 방법보다 훨씬 빠르다고 생각합니다 (기본적으로 조회 일뿐입니다).
@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"
대문자를 원한다고 가정합니다.
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"입니다.