整数をアルファベットに基づいた同等の文字に変換したい。例えば:
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);
複数文字の文字列を取得することを気にしない場合は、任意の正のインデックスをサポートできます。
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
(精度エラーについて徹底的にテストされていません:)
簡単な答えは(26文字)です:
String.fromCharCode(97+n);
スペースが貴重な場合は、次のことを行うことができます(20文字):
(10+n).toString(36);
これらすべての余分なバイトで何ができるかを考えてください!
これがどのように機能するかは、数値を基数36に変換するため、次の文字があります。
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
10オフセットすることにより、文字は0
ではなくa
で始まります。
ただし、クライアント側で2つの異なるサンプルを実行する速度が比較されるかどうかは完全にはわかりません。
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文字に一致するUnicode値から文字列を返します。
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を返します。注:配列は1回だけ作成され、閉鎖のため、新しい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"
97
や36
のようなマジックナンバーを使用するすべてのソリューションが好きではありません。
const A = 'A'.charCodeAt(0);
let numberToCharacter = number => String.fromCharCode(A + number);
let characterToNumber = character => character.charCodeAt(0) - A;
これは大文字を想定し、「A」を0から開始します。