2011-11-09 30 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

這是八進制文字被棄用的原因之一。他們不僅困惑,這個怪癖讓他們變得更加加倍。他們應該從一開始就拋出一個錯誤。 –

相關問題