-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathspell.js
119 lines (104 loc) · 6.59 KB
/
spell.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
var spell = function(userInput) {
var numToWorkOn;
//create map for all unique names in numbering system
var oneToTen = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"],
elevenToNineteen = ['ten', 'eleven', 'twelve', 'thirteen', 'forteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'],
multipleOfTen = ['', '', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'],
placeValue = ["", " thousand ", " million ", " billion ", " trillion ", " quadrillion ", " quintillion ", " sextillion ", " septillion ", " octillion ", " nonillion ", " decillion ", " undecillion ", " duodecillion ", " Tredecillion ", " Quattuordecillion ", " Quindecillion ", " Sedecillion ", " Septendecillion ", " Octodecillion ", " Novemdecillion ", " Vigintillion ", " unvigintillion ", " duovigintillion ", " trevigintillion ", " quattuorvigintillion ", " quinvigintillion ", " sexvigintillion ", " septenvigintillion ", " octovigintillion ", " novemvigintillion ", " trigintillion ", " untrigintillion ", " duotrigintillion ", " tretrigintillion ", " quattuortrigintillion ", " quintrigintillion ", " sextrigintillion ", " septentrigintillion ", " octotrigintillion ", " novemtrigintillion ", " quadragintillion ", " unquadragintillion ", " duoquadragintillion ", " trequadragintillion ", " quattuorquadragintillion ", " quinquadragintillion ", " sexquadragintillion ", " septenquadragintillion ", " octoquadragintillion ", " novemquadragintillion ", " quinquagintillion ", " unquinquagintillion ", " duoquinquagintillion ", " trequinquagintillion ", " quattuorquinquagintillion ", " quinquinquagintillion ", " sexquinquagintillion ", " septenquinquagintillion ", " octoquinquagintillion ", " novemquinquagintillion ", " sexagintillion ", " unsexagintillion ", " duosexagintillion ", " tresexagintillion ", " quattuorsexagintillion ", " quinsexagintillion ", " sexsexagintillion ", " septsexagintillion ", " octosexagintillion ", " octosexagintillion ", " septuagintillion ", " unseptuagintillion ", " duoseptuagintillion ", " treseptuagintillion ", " quinseptuagintillion", " sexseptuagintillion", " septseptuagintillion", " octoseptuagintillion", " novemseptuagintillion", " octogintillion", " unoctogintillion", " duooctogintillion", " treoctogintillion", " quattuoroctogintillion", " quinoctogintillion", " sexoctogintillion", " septoctogintillion", " octooctogintillion", " novemoctogintillion", " nonagintillion", " unnonagintillion", " duononagintillion", " trenonagintillion ", " quattuornonagintillion ", " quinnonagintillion ", " sexnonagintillion ", " septnonagintillion ", " octononagintillion ", " novemnonagintillion ", " centillion"];
//To check if spell has been called as a function call : spell(123) window.spell(123)
if (typeof(userInput) == "number" || typeof(userInput) == "string") {
numToWorkOn = "" + userInput;
}
//To check if spell has been called using a Number/String Object: "123".spell() 123..spell()
else if (typeof(this) == "object") {
numToWorkOn = this.toString();
} else {
return "Invalid Input";
}
//Put limit check on the program, placevalue map should be increased to increase capacity
if (numToWorkOn.length >= 303) {
return "Number out of bonds!";
} else if (!numToWorkOn.length) {
return "Invalid Input";
}
// to hadle long numbers which are converted to exponential forms e.g. 1.21313e+213
if (numToWorkOn.indexOf("e+") !== -1) {
var splittedExponentNum = numToWorkOn.split("e+"),
exponent = splittedExponentNum[1],
str = '';
while (exponent--) {
str = str + '0';
}
numToWorkOn = splittedExponentNum[0].split(".").join("") + str;
}
//To check our final string against invalid entries
var reg = new RegExp('^[0-9]+$');
if (!reg.test(numToWorkOn)) {
return "Invalid Input";
} else {
return convertToString(numToWorkOn);
}
//Recursie logic to break number into strings of length 3 each and recursively pronounce each
function convertToString(stringEquivalent) {
if (stringEquivalent == 0) {
return 'zero'
}
var result = '',
unitLookup = 0,
strLength = stringEquivalent.length;
for (var k = strLength; k > 0; k = k - 3) {
var subStr = stringEquivalent.substring(k, k - 3),
pronounce = pronounceNum(subStr);
if (pronounce.toUpperCase() != 'ZERO') {
result = pronounce + placeValue[unitLookup] + ' , ' + result;
}
unitLookup++;
}
//to trim of the extra ", " from last
return result.substring(0, result.length - 3)
}
//Determines the range of input and calls respective function
function pronounceNum(val) {
val = parseInt(val);
if (parseInt(val / 10) == 0) {
return numLessThan10(val);
} else if (parseInt(val / 100) == 0) {
return numLessThan99(val)
} else
return numLessThan1000(val);
}
//Pronounces any number less than 1000
function numLessThan1000(val) {
val = Number(val);
var hundredPlace = parseInt(val / 100),
result;
if (val % 100 == 0) {
result = oneToTen[hundredPlace] + " hundred ";
} else {
result = oneToTen[hundredPlace] + " hundred " + numLessThan99(val % 100);
}
return result;
}
//Pronounces any number less than 99
function numLessThan99(val) {
val = Number(val);
var tenthPlace = parseInt(val / 10),
result;
if (tenthPlace !== 1) {
val % 10 ? (result = multipleOfTen[tenthPlace] + " " + numLessThan10(val % 10)) : (result = multipleOfTen[tenthPlace]);
return result;
} else {
result = elevenToNineteen[val % 10];
return result;
}
}
//Pronounces any number less than 10
function numLessThan10(val) {
val = Number(val);
return oneToTen[val];
};
}
//add Spell to Window Object and Number/String prototype
window.spell = spell;
String.prototype.spell = spell;
Number.prototype.spell = spell;