基于非0的数字范围的模数

时间:2013-12-30 00:38:57

标签: javascript ascii

我正在尝试操作给定字母串(所有大写字母)的ASCII码。在下面的示例中,我将ASCII代码递增1并将其输出到#newText

<h2 id="text">ABCXYZ</h2>
<h2 id="newText">placeholder</h2>

var text = document.getElementById("text").firstChild.nodeValue;
var newText = "";

for (i=0; i < text.length; i++){
  newText = newText + String.fromCharCode(text.charCodeAt(i)+1);
}

document.getElementById("newText").firstChild.nodeValue = newText;

JSFiddle:http://jsfiddle.net/KatieK/gg9Hx/19/

问题是Z被改为[。 (这是有道理的,因为A-Z的ASCII范围是65-90,而[的ASCII值是91.)相反,我希望Z转换为A.

我已经尝试过模数来获取ASCII值,但是我对非0范围的ASCII值有困难。

如果x = 91;,则console.log(((x-65)%26)+65);会产生65,这很好。但是如果x = 64;那么相同的公式会导致64,当我希望它为90时。

在递增和调制大写字母的ASCII值时,如何计算大写字母的ASCII值的非零范围?在这个例子中,我想把91变成65,92变成66,93变成67,64变成90,63变成89,62变成88作为例子。

4 个答案:

答案 0 :(得分:2)

您可以使用另一个x填充26来处理65以下的值。

console.log(((x+26-65)%26)+65);

如果您需要更多填充,只需添加26的其他倍数。

答案 1 :(得分:1)

嗯,A-Z是26个字符,所以你的算术模26也是如此。然后将结果(0 ... 25)编码为所需的字符范围,在这种情况下就像添加65一样简单。

与解码类似,首先从字符范围转换为数字,然后应用算术。

答案 2 :(得分:1)

您需要一个条件来查看该数字是否低于65或高于90,然后与您目前为数字超过90的数字做相反的事情

var x = text.charCodeAt(i)+1;
    x = x > 90 ? ((x-65)%26)+65 : x < 65 ? (((x+65)%26)+65) : x;
    newText = newText + String.fromCharCode(x);

FIDDLE

要使其适用于任何数字,请使用

x = x > 90 ? x-(Math.ceil((x-90)/26)*26) : x < 65 ? x+(Math.ceil((65-x)/26)*26) : x;

答案 3 :(得分:-1)

您拥有解决方案的第一部分console.log(((x-65)%26)+65);。正如您所注意到的,它在某些情况下有效,但在其他情因此,在其工作的情况下使用它,并在其他情况下使用其他东西。只需编写符合您需要的代码即可。