整数を、アルファベットに基づいて同等の文字に変換したい。例えば:
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
あなたが言ったように、私の意見よりもはるかにエレガントで、非常に簡単に拡張できます。
[]
、文字列のインデックス演算子をサポートしていません。
[]
文字列のプロパティアクセサーである@Crescentは、IE8以降のIEでサポートされています(IE7互換モードの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
ます。
ただし、クライアント側で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
}
を使用し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"
大文字が欲しいと仮定すると:
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') is ["A"、 "C"、 "D"]
numberToLetter( '5')は"F"です