JavaScript中如何将字母转换为数字

16

我想知道如何将输入的每个字母字符转换为数字。

例如:a=1,b=2,c=3,一直到 z=26

在C语言中,我成功地实现了类似的功能,通过获取一个字符输入并将其显示为整数。但是我不确定如何在JavaScript中实现这一点。


1
你可以展示一个使用案例吗?比如你是怎么获取这个字符的? - Teemu
当点击按钮时,我正在从HTML输入表单中获取字符,页面会显示字母的数字值。 - Alex Kom
9个回答

62
如果我理解正确的话,其他答案都过于复杂:
parseInt('a', 36) - 9; // 1
parseInt('z', 36) - 9; // 26
parseInt('A', 36) - 9; // 1
parseInt('Z', 36) - 9; // 26

现在,回答你在评论中提出的问题:

function sumChars(s) {
  var i, n = s.length, acc = 0;
  for (i = 0; i < n; i++) {
    acc += parseInt(s[i], 36) - 9;
  }
  return acc;
}

console.log(sumChars("az"))

然而,与位置表示法相比,这种整数的记法占用空间较大。在两种记法中比较一下 "baz":
sumChars("baz") // 29
parseInt("baz", 36) // 14651

enter image description here

正如您所看到的,字母数量相同,但是36进制整数要大得多,换句话说,36进制可以在相同的空间中存储更大的数字。此外,在JavaScript中将10进制整数转换为36进制整数非常简单:
(14651).toString(36) // "baz"

最后,当你想要存储数值时,请小心。虽然听起来有些违反直觉,但是基于2的进制比基于36的进制更加紧凑。实际上,一个字母在内存中至少占据8位:

(35).toString(2).length // 6 bits long
(35).toString(36).length * 8 // 8 bits long

因此,我建议使用“真正的”整数进行存储,反正很容易转换回36进制。

1
这非常简单和直接。谢谢! - eagercoder
为什么在这里要减去9? parseInt('a', 36) - 9? - Kick Buttowski
嗨@KickButtowski :-) 因为parseInt('0', 36)得到0,parseInt('1', 36)得到1,parseInt('2', 36)得到2,...,parseInt('9', 36)得到9,parseInt('a', 36)得到10,parseInt('b', 36)得到11,以此类推...但是OP想要'a'是1 :-) - user1636522
@KickButtowski,顺便提一下,基数36意味着你有36个数字来表示一个数字,其中包括从0到9的10个数字和从a到z的26个字母。为了帮助你理解如何将基数36的数字转换为相同的十进制数字,我们将自然数在两种进制下并排列出:0(36) = 0(10),...,9(36) = 9(10),a(36) = 10(10),b(36) = 11(10),...,z(36) = 35(10),10(36) = 10(36) + 0(36) = 36(10) + 0(10) = 36(10),11(36) = 10(36) + 1(36) = 36(10) + 1(10) = 37(10),...,1a(36) = 10(36) + a(36) = 36(10) + 10(10) = 46(10),等等... - user1636522

9
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;

编辑:

可能性计算字符串中的字母,aa=2,ab=3等。

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开始,因此对于a它将返回0。使用var letterPosition = alphabet.indexOf(letter)+1;会更好。 - David Jacquel
@ErikVandeVen,你的方法是否可以将字母加在一起呢?例如:aaa=3,az=27等。 - Alex Kom
2
可能是这样,但为什么“ab”应该是27呢? - Erik van de Ven
我是说抱歉让你感到困惑了。 - Alex Kom
@ErikVandeVen 谢谢你的帮助。 - Alex Kom
显示剩余2条评论

3
在 JavaScript 中,字符并不是单个字节的数据类型,因此如果您想模仿 C 的工作方式,就需要自己创建一个映射。

例如,使用一个简单的对象作为映射:

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

这样,var number = charachters['a']; 将把 number 设置为 1。其他人提供了更简短的方法,这些方法可能更可行,而这种方法主要是为了易于理解。

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

你正在创建一个字母数组,然后在String.replace函数中使用回调函数,并将相应字母的索引+1作为索引返回,因为索引从0开始。

1

这将起作用

"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
你可以创建一个对象,映射这些值 -
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') 返回: (数组) [26,15,15] ;

letterValue('z') 返回: (数字) 26


1
您可以尝试这个简单的函数。

#解决方案1。

function createIndecesFromChar() {
  let hash = {};
  for(let n = 1; n <= 26; n++) {
     hash[String.fromCharCode(96+n)] = n;     // in case of lowercase letters;
  }

  return hash;
}

console.log(createIndecesFromChar());

// output 
// { 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 }

#解决方案 2.另一种功能性直接的方法。

const indexedMap = Object.fromEntries(Array.from({ length: 26 }, (_, c) => [String.fromCharCode(97+c), c+1]));

console.log(createIndecesFromChar());

// output - same result as above.
// { 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 }

1
你可以获取ASCII值并减去64来得到大写字母。
var letterPlacement = "A".charCodeAt(0) - 64;

或减去96得到小写字母。

var letterPlacement = "a".charCodeAt(0) - 96;

或者作为一个漂亮整洁的一行函数,不关心大小写:
function alphabetifier(letter) {
    return letter.charCodeAt(0) - (letter === letter.toLowerCase() ? 96 : 64);
}      

但是有些帖子使用了97?非常令人困惑 :/ - Kick Buttowski
实际上只是97,但这会给出一个索引,所以是96。 "a".charCodeAt() - 96; 或者 "a".charCodeAt() - 97 + 1; 希望现在清楚了。 :) - Anuj Srivastava

0

function convertAlpha(ch){
  //ASCII code of a is 97 so subtracting 96 would give 1 and so on
  return ch.charCodeAt(0)-96;
}

console.log(convertAlpha("b")); // returns 2

对于大写字母,可以使用 if 语句执行类似的操作。对于大写字母,我们将减去 64,因为字符 'A' 的 ASCII 值为 65,所以 65-64 = 1,并且其他字母也是如此。


使用 parseInt,您不必处理大写字母 https://dev59.com/114c5IYBdhLWcg3weaT8#30697101 :-) - user1636522

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接