2015-01-10 11 views
5

Chciałbym wiedzieć, jak przekonwertować każdy wprowadzony znak alfabetu na liczbę.Konwersja listu na numer w JavaScript

np. a = 1, b = 2, c = 3 do z = 26

W C udało mi się zrobić coś podobnego, wprowadzając dane znakowe i wyświetlając je jako liczbę całkowitą. Ale nie jestem pewien, jak to zrobiłbym w JavaScript.

+1

Czy możesz pokazać przypadek użycia, np. Jak zdobywasz postać? – Teemu

+0

Otrzymuję znak z formularza wejściowego HTML, po kliknięciu przycisku na stronie wyświetlana jest wartość liczbowa litery. –

Odpowiedz

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:

Możliwość obliczenia litery wewnątrz Ciąg, aa = 2, ab = 3 itd

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

Musisz dać +1 do letterPosition, ponieważ pierwsza tablica będzie równa 0, więc "a" = 0, a nie "a" = 1. – NewToJS

+0

Ponieważ indeks tablicy zaczyna się od 0, da 0 dla a. 'var letterPosition = alphabet.indexOf (letter) +1;' is better. –

+0

dobry punkt.Zaktualizuję moją odpowiedź: –

1

W JavaScript znaki nie są typem bajtów jednego bajtu, więc jeśli chcesz naśladować działanie C, musisz utworzyć mapowanie samodzielnie.

na przykład za pomocą prostego obiektu mapy:

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

ten sposób var number = charachters['a']; ustawi numer do 1. Pozostali dostarczyli zwięzłe metody, które są najprawdopodobniej bardziej wykonalne, celem tego jest przede wszystkim łatwe zrozumienie.

1

Można to zrobić następująco

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

co robisz jest stworzenie tablicy alfabetów, a następnie przy użyciu wywołania zwrotnego w String.replace funkcji i powracający odpowiednie indeksy listu +1 jako indeksy zaczynają się od 0

1

To zadziała

"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

można utworzyć obiekt, który odwzorowuje values-

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 ') zwraca: (tablica) [26,15,15];

letterValue ('z') powraca: (numer) 26

27

Gdybym Ci rację, odpowiedzi udzielane są przez skomplikowany  :

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

Genialny! Dzięki! (: – GTodorov

+0

Co powiesz na: ''az'.split (' '). Reduce ((acc, letter) => acc + (parseInt (letter, 36) - 9), 0)' – frosty

+1

@frosty Yuk :-(I nie lubię "funkcjonalnego" stylu w JavaScript, myślę, że jest to zła cecha i zły sposób na nauczanie programowania, to znaczy, może to być mylące, ukryć pętlę, jeśli chcesz, ale obliczenia wciąż tu są. Tak przy okazji, wierzę, że Stack Overflow nie jest konkurencją dla najkrótszego lub najbardziej egzotycznego kodu, inteligentny kod jest lepszy. Przykro mi, ale naprawdę nie podoba mi się ten nowy trend x-) – leaf