2015-01-10 15 views
5

Vorrei sapere come convertire ciascun carattere alfabetico inserito in un numero.Converti la lettera in numero in JavaScript

ad es. a = 1, b = 2, c = 3 fino a z = 26

In C ero riuscito a fare qualcosa di simile, prendendo un carattere inserito e visualizzandolo come un numero intero. Ma non sono sicuro di come lo farei in JavaScript.

+1

Puoi mostrare un caso d'uso, cioè come stai prendendo il personaggio? – Teemu

+0

Ricevo il carattere da un modulo di input HTML, quando si fa clic su un pulsante la pagina mostrerà il valore numerico della lettera. –

risposta

4
var alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]; 
var letter = "h"; 
var letterPosition = alphabet.indexOf(letter)+1; 

EDIT:

possibilità di calcolare le lettere all'interno di un stringa, aa = 2, ab = 3, ecc

function str_split(string, split_length) { 
    // discuss at: http://phpjs.org/functions/str_split/ 
    // original by: Martijn Wieringa 
    // improved by: Brett Zamir (http://brett-zamir.me) 
    // bugfixed by: Onno Marsman 
    // revised by: Theriault 
    // revised by: Rafał Kukawski (http://blog.kukawski.pl/) 
    // input by: Bjorn Roesbeke (http://www.bjornroesbeke.be/) 
    // example 1: str_split('Hello Friend', 3); 
    // returns 1: ['Hel', 'lo ', 'Fri', 'end'] 

    if (split_length == null) { 
    split_length = 1; 
    } 
    if (string == null || split_length < 1) { 
    return false; 
    } 
    string += ''; 
    var chunks = [], 
    pos = 0, 
    len = string.length; 
    while (pos < len) { 
    chunks.push(string.slice(pos, pos += split_length)); 
    } 

    return chunks; 
} 


function count(string){ 
    var alphabet = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]; 

    var splitted_string = str_split(string); 

    var count = 0; 
    for (i = 0; i < splitted_string.length; i++) { 
     var letterPosition = alphabet.indexOf(splitted_string[i])+1; 
     count = count + letterPosition; 
    } 
    return count; 
} 

console.log(count("az")); // returns 27 in the console 
+0

Dovresti fare +1 su letterPosition poiché il primo array sarà 0 quindi "a" = 0, non "a" = 1. – NewToJS

+0

Come indice di matrice inizia da 0, darà 0 per a. 'var letterPosition = alphabet.indexOf (letter) +1;' è migliore. –

+0

buon punto.Aggiornerò la mia risposta –

1

In JavaScript i caratteri non sono un tipo di dati a byte singolo, quindi se si desidera simulare il funzionamento di C, è necessario creare una mappatura da soli.

Ad esempio utilizzando un semplice oggetto come mappa:

var characters: { 
    'a': 1, 
    'b': 2, 
    ... 
} 

questo modo var number = charachters['a']; imposterà numero 1. Gli altri hanno fornito metodi in cortocircuito, che sono probabilmente più fattibili, questo è principalmente finalizzato a una facile comprensione.

1

Si potrebbe fare così

function convertToNumbers(str){ 
    var arr = "abcdefghijklmnopqrstuvwxyz".split(""); 
    return str.replace(/[a-z]/ig, function(m){ return arr.indexOf(m.toLowerCase()) + 1 }); 
} 

cosa stai facendo è la creazione di una serie di alfabeti e quindi utilizzando il callback in String.replace funzione e la restituzione dei rispettivi indici della lettera +1 come gli indici partono da 0

1

Ciò funzionerà

"abcdefghijklmnopqrstuvwxyz".split("").forEach(function (a,b,c){ console.log(a.toLowerCase().charCodeAt(0)-96)}); 


"iloveyou".split("").forEach(function (a,b,c){ console.log(a.toLowerCase().charCodeAt(0)-96)}); 

9 
12 
15 
22 
5 
25 
15 
21 
1

Si può fare un oggetto che associa il VALORI

function letterValue(str){ 
    var anum={ 
     a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, g: 7, h: 8, i: 9, j: 10, k: 11, 
     l: 12, m: 13, n: 14,o: 15, p: 16, q: 17, r: 18, s: 19, t: 20, 
     u: 21, v: 22, w: 23, x: 24, y: 25, z: 26 
    } 
    if(str.length== 1) return anum[str] || ' '; 
    return str.split('').map(letterValue); 
} 

letterValue ('zoo ') Ritorna: (matrice) [26,15,15];

letterValue ('z') rendimenti: (numero) 26

27

Se ho ragione, le risposte fornite sono più complicate  :

parseInt('a', 36) - 9; // 1 
parseInt('z', 36) - 9; // 26 
parseInt('A', 36) - 9; // 1 
parseInt('Z', 36) - 9; // 26 
'a'.charCodeAt() - 96; // 1 
'z'.charCodeAt() - 96; // 26 
'A'.charCodeAt() - 64; // 1 
'Z'.charCodeAt() - 64; // 26 
function charToNumber (s, i) { 
    return parseInt(s.charAt(i), 36) - 9; 
} 

function sumChars (s) { 
    var i = s.length, r = 0; 
    while (--i >= 0) r += charToNumber(s, i); 
    return r; 
} 
sumChars('az'); // 27 
+1

Brillante! Grazie! (: – GTodorov

+0

Come su: ''az'.split (' '). Reduce ((acc, lettera) => acc + (parseInt (lettera, 36) - 9), 0)' – frosty

+1

@frosty Yuk :-(I non mi piace lo stile "funzionale" in JavaScript, penso che sia una brutta caratteristica e un cattivo modo di insegnare programmazione. Voglio dire, può essere fuorviante, nascondere il ciclo se vuoi, ma il calcolo è ancora qui. A proposito, credo che Stack Overflow non è una competizione per il codice più corto o più esotico, il codice smart è migliore. Mi dispiace ma non mi piace davvero questa nuova tendenza x-) – leaf