整数を同等の文字に変換します。0=> a、1 => bなどです。


173

整数を、アルファベットに基づいて同等の文字に変換したい。例えば:

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

など配列を作成して、必要なときにそれを検索することもできますが、これを行うための組み込み関数があるかどうか疑問に思っています。私がGoogleで見つけたすべての例は、ASCII値で機能しており、アルファベット内の文字の位置ではありません。


2
小文字はASCIIでアルファベット順に並べられます。
アノン。

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あなたが言ったように、私の意見よりもはるかにエレガントで、非常に簡単に拡張できます。
サーシャチェディゴフ2010年

8
また、拡張する必要がない場合、おそらくエラーが発生しやすくなりますか?abcede
ネルソン

5
FYI JScript(IE)は[]、文字列のインデックス演算子をサポートしていません。
Crescent Fresh

4
[]文字列のプロパティアクセサーである@Crescentは、IE8以降のIEでサポートされています(IE7互換モードの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 2016年

@mikemaccana、なぜこの編集?読みにくくなると思います。コードを読むには、横にスクロールする必要があります。
z0r 2017年

@ z0rしたがって、コードを使用する人々は改行を修正する必要はありません。任意に改行する理由はありません。エディタはウィンドウの文字サイズで折り返します。
mikemaccana 2017年

これはうまくいきますが、反対のことをする変種はありますか?
Ethannn 2017

:このに変更するまで、ニースのアイデアが、それはうまくいきませんでした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つの異なる例をどれだけ高速に実行すると比較できるかは完全にはわかりません。


2
私はあなたのベース36の創造性を楽しんだ
Josh

6

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
}

4
まあ、それを理解するには、無限数ではなく、可変数の引数を取ります
wchargin 2015年

4

97またはのようなマジックナンバーを使用するすべてのソリューションが好きではありません36

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

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

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

これは大文字を想定しており、「A」は0から始まります。



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を返します。注:配列は1回だけ作成され、クロージャーのため、新しいcodeToChar関数で使用できます。最初の方法よりもさらに高速だと思います(基本的には単なるルックアップです)。


これはASCIIで機能します。アルファベットの文字の位置を操作する必要があります。
VIVA LA NWO

@VIVA-あなたはこれを解決できただろうと思いますか?@Galambalaza-64ではなく65が欲しいと思う
James Westgate

私はそれがいかにシンプルかを示しました。彼はこれを解決できただろう。しかし、あなたは行き​​ます。アップデートを見る
gblazex 2010年

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') is ["A"、 "C"、 "D"]

numberToLetter( '5')"F"です

数字から文字への関数

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.