整数をアルファベットに基づいた同等の文字に変換したいと思います。例えば:
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);
簡単な答えは(26文字)です:
String.fromCharCode(97+n);
スペースが貴重な場合は、次のことができます (20 文字):
(10+n).toString(36);
これらすべての余分なバイトで何ができるか考えてみてください!
これがどのように機能するかは、数値を基数 36 に変換するため、次の文字が得られます。
0123456789abcdefghijklmnopqrstuvwxyz
^ ^
n n+10
10 ずつオフセットすることにより、文字はa
ではなく で始まり0
ます。
ただし、クライアント側で 2 つの異なる例を実行した場合の速度については、完全にはわかりません。
JavascriptのString.fromCharCode(code1、code2、...、codeN)は、無限の数の引数を取り、対応するASCII値がcode1、code2、...codeNである文字列を返します。97はASCIIでは「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
}
そこに行きます:(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関数で使用できます。最初の方法よりもさらに高速だと思います(基本的には単なるルックアップです)。
を使用しString.fromCharCode
ます。これは、ASCII の最初の 128 文字に一致する Unicode 値から文字列を返します。
var a = String.fromCharCode(97);
@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"