Skip to content

Commit bf9911b

Browse files
beingmohityamadapc
authored andcommitted
Added Support For Indian Numbering System (#37)
1 parent a683136 commit bf9911b

File tree

4 files changed

+153
-7
lines changed

4 files changed

+153
-7
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ Currently supported languages are:
4444
- French `lang = "fr"`
4545
- Esperanto `lang = "eo"`
4646
- Vietnamese `lang = "vi"`
47+
- English (Indian) `lang = "enIndian"`
4748

4849
### Spanish Example
4950
```javascript

lib/i18n/en-indian.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
{
2+
"useLongScale": false,
3+
"baseSeparator": "-",
4+
"unitSeparator": "and ",
5+
"base": {
6+
"0": "zero",
7+
"1": "one",
8+
"2": "two",
9+
"3": "three",
10+
"4": "four",
11+
"5": "five",
12+
"6": "six",
13+
"7": "seven",
14+
"8": "eight",
15+
"9": "nine",
16+
"10": "ten",
17+
"11": "eleven",
18+
"12": "twelve",
19+
"13": "thirteen",
20+
"14": "fourteen",
21+
"15": "fifteen",
22+
"16": "sixteen",
23+
"17": "seventeen",
24+
"18": "eighteen",
25+
"19": "nineteen",
26+
"20": "twenty",
27+
"30": "thirty",
28+
"40": "forty",
29+
"50": "fifty",
30+
"60": "sixty",
31+
"70": "seventy",
32+
"80": "eighty",
33+
"90": "ninety"
34+
},
35+
"units" : {
36+
"2": "hundred",
37+
"3": "thousand",
38+
"5": "lakh",
39+
"7": "crore"
40+
},
41+
"unitExceptions": []
42+
}

lib/index.js

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ var i18n = {
1111
eo: require('./i18n/eo.json'),
1212
it: require('./i18n/it.json'),
1313
vi: require('./i18n/vi.json'),
14+
enIndian: require('./i18n/en-indian.json'),
1415
};
1516
exports.i18n = i18n;
1617

@@ -47,8 +48,28 @@ function writtenNumber(n, options) {
4748
? i18n[options.lang]
4849
: options.lang;
4950
var scale = language.useLongScale ? longScale : shortScale;
51+
var units = language.units;
5052
var unit;
5153

54+
55+
56+
if (! (units instanceof Array))
57+
{
58+
var rawUnits = units;
59+
60+
units = [];
61+
scale = Object.keys(rawUnits);
62+
63+
for (var i in scale)
64+
{
65+
units.push(rawUnits[scale[i]])
66+
scale[i] = Math.pow(10, parseInt(scale[i]));
67+
}
68+
}
69+
70+
71+
72+
5273
if (!language) {
5374
if (languages.indexOf(writtenNumber.defaults.lang) < 0) {
5475
writtenNumber.defaults.lang = 'en';
@@ -74,15 +95,18 @@ function writtenNumber(n, options) {
7495
n -= m;
7596
} else ret = [];
7697

77-
for(var i = 0, len = language.units.length; i < len; i++) {
98+
for(var i = 0, len = units.length; i < len; i++) {
7899
var r = Math.floor(n / scale[i]);
79-
if(i === 0) {
80-
r %= 10;
81-
} else if(!language.useLongScale || (i === 1 && language.useLongScale)) {
82-
r %= 1000;
83-
} else r %= 1000000;
100+
101+
if (i == len - 1)
102+
var divideBy = 1000000;
103+
else
104+
var divideBy = scale[i+1] / scale[i];
105+
106+
r %= divideBy;
107+
108+
unit = units[i];
84109

85-
unit = language.units[i];
86110
if(r && unit.useBaseInstead) {
87111
if(unit.useBaseException.indexOf(r) < 0) {
88112
ret.push(baseCardinals[r * scale[i]]);
@@ -126,3 +150,4 @@ function handleSmallerThan100(n, language, unit, baseCardinals, options) {
126150
}
127151
return baseCardinals[dec];
128152
}
153+

test/index.test.js

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -321,4 +321,82 @@ describe('written-number', function() {
321321
);
322322
});
323323
});
324+
325+
describe('writtenNumber(n, { lang: \'enIndian\', ... })', function() {
326+
before(function() {
327+
writtenNumber.defaults.lang = 'enIndian';
328+
});
329+
330+
it('gets exposed', function() {
331+
should.exist(writtenNumber);
332+
writtenNumber.should.be.instanceof(Function);
333+
});
334+
335+
it('doesn\'t blow up weirdly with invalid input', function() {
336+
writtenNumber('asdfasdfasdf').should.equal('');
337+
writtenNumber('0.as').should.equal('');
338+
writtenNumber('0.123').should.equal('zero');
339+
writtenNumber('0.8').should.equal('one');
340+
writtenNumber('2.8').should.equal('three');
341+
writtenNumber('asdf.8').should.equal('');
342+
writtenNumber('120391938123..').should.equal('');
343+
writtenNumber(1000000000).should.equal('one hundred crore');
344+
writtenNumber('1/3').should.equal('');
345+
writtenNumber(1/3).should.equal('zero');
346+
writtenNumber('1/2').should.equal('');
347+
writtenNumber('1.123/2').should.equal('');
348+
});
349+
350+
it('correctly converts numbers < 10', function() {
351+
writtenNumber(1000000000).should.equal('one hundred crore');
352+
writtenNumber(3).should.equal('three');
353+
writtenNumber(8).should.equal('eight');
354+
});
355+
356+
it('correctly converts numbers < 20', function() {
357+
writtenNumber(13).should.equal('thirteen');
358+
writtenNumber(19).should.equal('nineteen');
359+
});
360+
361+
it('correctly converts numbers < 100', function() {
362+
writtenNumber(20).should.equal('twenty');
363+
writtenNumber(25).should.equal('twenty-five');
364+
writtenNumber(88).should.equal('eighty-eight');
365+
writtenNumber(73).should.equal('seventy-three');
366+
});
367+
368+
it('correctly converts numbers < 1000', function() {
369+
writtenNumber(200).should.equal('two hundred');
370+
writtenNumber(242).should.equal('two hundred and forty-two');
371+
writtenNumber(1234).should.equal(
372+
'one thousand two hundred and thirty-four'
373+
);
374+
writtenNumber(4323).should.equal(
375+
'four thousand three hundred and twenty-three'
376+
);
377+
});
378+
379+
it('correctly converts numbers > 1000', function() {
380+
writtenNumber(4323000).should.equal(
381+
'forty-three lakh twenty-three thousand'
382+
);
383+
writtenNumber(4323055).should.equal(
384+
'forty-three lakh twenty-three thousand and fifty-five'
385+
);
386+
writtenNumber(1570025).should.equal(
387+
'fifteen lakh seventy thousand and twenty-five'
388+
);
389+
});
390+
391+
it('correctly converts numbers > 1 000 000 000', function() {
392+
writtenNumber(1000000000).should.equal('one hundred crore');
393+
writtenNumber(2580000000).should.equal(
394+
'two hundred fifty-eight crore'
395+
);
396+
writtenNumber(1000000000000).should.equal('one lakh crore');
397+
writtenNumber(3627000000000).should.equal(
398+
'three lakh sixty-two thousand seven hundred crore'
399+
);
400+
});
401+
});
324402
});

0 commit comments

Comments
 (0)