在 JavaScript 中将字母转换为数字
Convert letter to number in JavaScript
我想知道如何将输入的每个字母字符转换为数字。
例如a=1, b=2 ,c=3 直到 z=26
在 C 中,我设法做了类似的事情,方法是获取字符输入并将其显示为整数。但我不确定在 JavaScript 中我将如何做到这一点。
在JavaScript中字符不是单字节数据类型,所以如果你想模仿C的工作方式,你需要自己创建一个映射。
例如使用一个简单的对象作为地图:
var characters: {
'a': 1,
'b': 2,
...
}
这样 var number = charachters['a'];
会将数字设置为 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
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
这会起作用
"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
您可以创建一个映射值的对象-
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') returns: (数组) [26,15,15] ;
letterValue('z') returns: (数字) 26
如果我没猜错,其他答案就太复杂了:
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"))
但是,与位置表示法相比,这种整数表示法 space 非常耗时。比较两种表示法中的“baz”:
sumChars("baz") // 29
parseInt("baz", 36) // 14651
如你所见,字母的数量是一样的,但是36进制整数要大很多,换句话说,36进制可以在相同的space中存储更大的数字。此外,将 10 进制整数转换为 36 进制整数在 JavaScript:
中很简单
(14651).toString(36) // "baz"
最后,存储值时要小心。虽然听起来有悖常理,但2进制比36进制更紧凑。确实,一个字母至少占内存8位:
(35).toString(2).length // 6 bits long
(35).toString(36).length * 8 // 8 bits long
因此我建议使用“真”整数进行存储,无论如何很容易回到基数 36。
你可以只得到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);
}
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,其他字母依此类推。
你可以试试这个简单的功能。
#Soln 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 }
#Soln 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 }
我想知道如何将输入的每个字母字符转换为数字。
例如a=1, b=2 ,c=3 直到 z=26
在 C 中,我设法做了类似的事情,方法是获取字符输入并将其显示为整数。但我不确定在 JavaScript 中我将如何做到这一点。
在JavaScript中字符不是单字节数据类型,所以如果你想模仿C的工作方式,你需要自己创建一个映射。
例如使用一个简单的对象作为地图:
var characters: {
'a': 1,
'b': 2,
...
}
这样 var number = charachters['a'];
会将数字设置为 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
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
这会起作用
"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
您可以创建一个映射值的对象-
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') returns: (数组) [26,15,15] ;
letterValue('z') returns: (数字) 26
如果我没猜错,其他答案就太复杂了:
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"))
但是,与位置表示法相比,这种整数表示法 space 非常耗时。比较两种表示法中的“baz”:
sumChars("baz") // 29
parseInt("baz", 36) // 14651
如你所见,字母的数量是一样的,但是36进制整数要大很多,换句话说,36进制可以在相同的space中存储更大的数字。此外,将 10 进制整数转换为 36 进制整数在 JavaScript:
中很简单(14651).toString(36) // "baz"
最后,存储值时要小心。虽然听起来有悖常理,但2进制比36进制更紧凑。确实,一个字母至少占内存8位:
(35).toString(2).length // 6 bits long
(35).toString(36).length * 8 // 8 bits long
因此我建议使用“真”整数进行存储,无论如何很容易回到基数 36。
你可以只得到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);
}
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,其他字母依此类推。
你可以试试这个简单的功能。
#Soln 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 }
#Soln 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 }