2011-11-09 17 views
2

有人写了这个(非常可怕的)函数来将数值从0-999转换为英文单词。为什么这个Javascript数组中的单元格错误?

function getNumberWords(number) { 
    var list = new Array(1000); 
    list[000] = "zero"; 
    list[001] = "one"; 
    list[002] = "two"; 
    list[003] = "three"; 
    ///skip a few 
    list[099] = "ninety nine"; 
    list[100] = "one hundred"; 
    list[101] = "one hundred and one"; 
    ///skip a few more 
    list[997] = "nine hundred and ninety seven"; 
    list[998] = "nine hundred and ninety eight"; 
    list[999] = "nine hundred and ninety nine"; 
    return list[number]; 
} 

在这里有一些相当奇怪的错误,我似乎无法找出原因。一些但不是全部的元素被放置在错误的单元格中。

我试图显示列表的contentes,它表现出了相当时髦结果:0-7有预期值

> list.toString(); 
"zero,one,two,three,four,five,six,seven,ten,eleven,twelve,thirteen,fourteen, 
fifteen,sixteen,seventeen,twenty,twenty one,twenty two,twenty three,twenty four, 
twenty five,twenty six,twenty seven,thirty,thirty one,thirty two,thirty three, 
thirty four,thirty five,thirty six,thirty seven,forty,forty one,forty two," 
///(skip a few) 
"sixty six,sixty seven,seventy,seventy one,seventy two,seventy three,seventy four, 
seventy five,seventy six,seventy seven,,,,,sixty eight,sixty nine,,,,,,,,, 
seventy eight,seventy nine,eighty,eighty one,eighty two,eighty three,eighty four," 
///(and so on) 

也就是说,元素。要素68,69和78-999也具有期望值。元素64-67和70-77是空的。元素8-63具有不正确的值。

这个世界正在发生什么?为什么15个单元格为空,56个单元格不正确,其余部分是否正确?

回答

5

开始0数字文本被解释为八进制值(如果它们也可以)—即,在基8的数字。这在JavascriptCC++,PHP,Perl,Bash和许多其他语言中就是这种情况。

现在,base-8 22基数为10 18因此,您不访问您认为自己的元素。您的前8个阵列元素都很好,因为自然地,base-8 0也基于-10 0,依此类推直到7。像069这样的值不会造成混淆,因为不可能代表以8为底的任何内容,所以Javascript回落到10。呸!


我建议使用间距排列,而不是:

function getNumberWords(number) { 
    var list = new Array(1000); 
    list[ 0] = "zero"; 
    list[ 1] = "one"; 
    list[ 2] = "two"; 
    list[ 3] = "three"; 
    ///skip a few 
    list[ 99] = "ninety nine"; 
    list[100] = "one hundred"; 
    list[101] = "one hundred and one"; 
    ///skip a few more 
    list[997] = "nine hundred and ninety seven"; 
    list[998] = "nine hundred and ninety eight"; 
    list[999] = "nine hundred and ninety nine"; 
    return list[number]; 
} 

我还建议把生成的即时琴弦新功能;它不应该是征税,当然也不是每次调用都创建这个数组。

+0

'22'八进制十进制实际上'18'是,但它是十九元,因为数组是零索引。 –

+0

@Peter:哈,哦,是啊,当然;) –

4

在Javascript中022表示22八进制(18十进制)。

Octal numeral system on Wikipedia

+0

为了完成八进制的思想--22十进制中的2 * 8 + 2 = 18,这是数组的第19个元素(因为第一个元素位于索引0)。 –

+0

@Ted谢谢,将结果添加到我的答案中。 – kapa

2

的0前缀意味着在JavaScript八进制,所以022是八进制:

022 = 2*8^1+2*8^0 = 18 

并且由于第一索引i 0,18对第19元件。

3

在非严格代码中以0开头的数字文字可能会导致该数字被解析为八进制文字(基数8)。例如,010被解析为值为8的数字。现在

八路文字被淘汰,并不再被解析为严格模式八进制,使用"use strict"

function a() { 
    alert(010); 
    // -> 8 
} 
function b() { 
    "use strict"; 
    alert(010); 
    // -> 10 
} 

并非所有的浏览器支持严格模式,所以现在只是改变你的代码,以确保数量不以0开始,或字符串将它们包装:

list[ 21 ] = "something" 
list["022"] = "something else"; 

字符串的工作,因为八进制数are not coerced

+0

并非总是如此。如果JavaScript不能胁迫八进制,它将强制为十进制。例如,'08'强制为'8'。 –

+0

@Paul:对不起。我很快就写了,因为我知道我在参加比赛;-)修正了。 –

+0

@AndyE:我希望我们已经吸取了今天在这里的教训! –

1

在JavaScript中,以0开头的数字被解释为八进制(基数8)。例如,010 === 8

奇怪的是,如果数字不可能达到八进制数,JavaScript会将数字解释为十进制数(基数为10),即使它具有八进制前缀。例如,08 === 8

+2

这是八进制文字被弃用的原因之一。他们不仅困惑,这个怪癖让他们变得更加加倍。他们应该从一开始就抛出一个错误。 –

相关问题