पूर्णांक को इसके वर्ण के समतुल्य में परिवर्तित करें, जहाँ 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 कम केस 'ए' के ​​लिए एएससीआईआई कोड है। यदि आप बड़े अक्षर चाहते हैं, तो 97 को 65 (अपरकेस 'ए') से बदलें। ध्यान दें कि यदि n > 25, आप अक्षरों की सीमा से बाहर निकल जाएंगे।


82

अन्य वर्णमालाओं के विस्तार के मामले में अधिक पोर्टेबल होगा:

char='abcdefghijklmnopqrstuvwxyz'[code]

या, अधिक संगत होने के लिए (हमारे प्यारे IE के साथ):

char='abcdefghijklmnopqrstuvwxyz'.charAt(code);

5
String.fromCharCodeमेरे विचार से बहुत अधिक सुरुचिपूर्ण , जैसा कि आपने कहा, यह बहुत आसानी से फैली हुई है।
साशा चेदिगोव

8
और जब आपको विस्तार करने की कोई आवश्यकता नहीं है, तो शायद त्रुटियों के लिए अधिक संभावना है? abcede
नेल्सन

5
FYI JScript (IE) []स्ट्रिंग्स पर इंडेक्स ऑपरेटर का समर्थन नहीं करता है ।
वर्धमान ताजा

4
@Crescent, []स्ट्रिंग्स पर संपत्ति एक्सेसर IE8 से IE पर समर्थित है (IE7 IE7 कॉम्पिटिटर मोड में IE8 भी काम नहीं करता है), ब्राउज़र संगतता के String.prototype.chatAtबजाय पसंद किया जाता []है। जैसे'foo'.charAt(0) == 'f'
CMS

2
@ कॉर्सेंट, यह उल्लेख करना भूल गया कि []स्ट्रिंग्स पर संपत्ति एक्सेसर 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
पुनरावर्ती कार्य, बहुत अच्छा!
जॉन वर्जोलिनो

@mikemaccana, यह संपादन क्यों? मुझे लगता है कि इसे पढ़ना कठिन है। अब मुझे कोड पढ़ने के लिए क्षैतिज रूप से स्क्रॉल करना होगा।
z0r

@ z0r तो कोड का उपयोग करने वाले लोगों को न्यूलाइन को ठीक नहीं करना पड़ेगा। मनमाने ढंग से लाइनों को तोड़ने का कोई कारण नहीं है, संपादक अपनी खिड़की के चरित्र आकार पर लपेटेंगे।
मिकमेकाना

यह महान काम करता है, क्या इसके विपरीत करने के लिए एक प्रकार है?
एथनन

अच्छा विचार है, लेकिन यह इस में परिवर्तित होने तक काम नहीं किया:function idOf(i) { return (i >= 26 ? idOf(Math.floor(i / 26) -1 ) : '') + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'[i % 26]; }
पैट्रिकvL

19

एक सरल उत्तर होगा (26 अक्षर):

String.fromCharCode(97+n);

यदि स्थान कीमती है, तो आप निम्नलिखित (20 अक्षर) कर सकते हैं:

(10+n).toString(36);

इस बारे में सोचें कि आप उन सभी अतिरिक्त बाइट्स के साथ क्या कर सकते हैं!

यह कैसे काम करता है आप संख्या को आधार 36 में बदल सकते हैं, इसलिए आपके पास निम्न वर्ण हैं:

0123456789abcdefghijklmnopqrstuvwxyz
^         ^
n        n+10

10 के aबजाय ऑफसेट करने से अक्षर शुरू होते हैं0

इस बारे में पूरी तरह से निश्चित नहीं है कि दो अलग-अलग उदाहरण क्लाइंट-साइड को कितनी तेजी से चला रहे हैं, हालांकि तुलना करेंगे।


2
मैंने आपका बेस 36 क्रिएटिविटी का आनंद लिया
जोश

6

जावास्क्रिप्ट का String.fromCharCode (code1, code2, ..., codeN) अनंत प्रकार के तर्कों को लेता है और ऐसे अक्षरों की वापसी करता है जिनके संबंधित ASCII मान कोड 1, कोड 2, ... कोडएन हैं। चूंकि 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
}

4
खैर, पांडित्यपूर्ण होने के लिए, यह एक परिवर्तनशील संख्या होती है, न कि एक अनंत संख्या।
व्रचगिन १४'१५

4

मुझे उन सभी समाधानों को पसंद नहीं है जो जादू की संख्या का उपयोग करते हैं जैसे 97या 36

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

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

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

यह बड़े अक्षरों को मानता है और 0 पर 'A' शुरू करता है।


3

का उपयोग करें String.fromCharCode। यह यूनिकोड मान से एक स्ट्रिंग लौटाता है, जो ASCII के पहले 128 अक्षरों से मेल खाता है।

var a = String.fromCharCode(97);

3

वहाँ तुम जाओ: (ए-जेडए-जेड)

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, या यह गलत (सीमा त्रुटि) लौटाएगा;

या:

var codeToChar = function() {
  var abc = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
  return function( code ) {
    return abc[code];
  };
})();

सीमा त्रुटि के मामले में अपरिभाषित रिटर्न। नोट: सरणी केवल एक बार बनाई जाएगी और बंद होने के कारण यह नए कोडटॉकर फ़ंक्शन के लिए उपलब्ध होगी। मुझे लगता है कि यह और भी तेज है तो पहली विधि (यह मूल रूप से केवल एक खोज है)।


वह ASCII के साथ काम करता है, मुझे वर्णमाला में चरित्र की स्थिति के साथ काम करने की आवश्यकता है।
विवा ला एनडब्ल्यूओ

@VIVA - मुझे लगता है कि आप यह काम कर सकते थे? @ गलम्बलजा - मुझे लगता है कि आप 65 नहीं 64 चाहते हैं
जेम्स वेस्टगेट

मैंने दिखाया कि यह कितना सरल है। वह यह काम कर सकता था। लेकिन तुम जाओ। अपडेट देखें
gblazex

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') है [ 'ए', 'सी', 'डी']

numberToLetter ( '5') है 'एफ'

पत्र समारोह के लिए नंबर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.