Skip to content

Commit b09b6a9

Browse files
committed
Merge branch 'bug/38-portuguese'
2 parents eddb4ca + b42114b commit b09b6a9

File tree

5 files changed

+387
-316
lines changed

5 files changed

+387
-316
lines changed

lib/i18n/pt.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
"useLongScale": false,
33
"baseSeparator": " e ",
44
"unitSeparator": "e ",
5+
"andWhenTrailing": true,
56
"base": {
67
"0": "zero",
78
"1": "um",
@@ -42,17 +43,17 @@
4243
"900": "novecentos",
4344
"1000": "mil"
4445
},
45-
"andException": {
46-
"10": true
47-
},
4846
"unitExceptions": {
4947
"1": "um"
5048
},
5149
"units" : [
5250
{
5351
"singular": "cento",
5452
"useBaseInstead": true,
55-
"useBaseException": [1],
53+
"useBaseException": [
54+
1
55+
],
56+
"useBaseExceptionWhenNoTrailingNumbers": true,
5657
"andException": true
5758
},
5859
{

lib/index.js

Lines changed: 102 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
'use strict';
1+
"use strict";
22
exports = module.exports = writtenNumber;
3-
var util = require('./util');
3+
var util = require("./util");
44

5-
var languages = ['en', 'es', 'pt', 'fr', 'eo', 'it', 'vi'];
5+
var languages = ["en", "es", "pt", "fr", "eo", "it", "vi"];
66
var i18n = {
7-
en: require('./i18n/en.json'),
8-
es: require('./i18n/es.json'),
9-
pt: require('./i18n/pt.json'),
10-
fr: require('./i18n/fr.json'),
11-
eo: require('./i18n/eo.json'),
12-
it: require('./i18n/it.json'),
13-
vi: require('./i18n/vi.json'),
14-
enIndian: require('./i18n/en-indian.json'),
7+
en: require("./i18n/en.json"),
8+
es: require("./i18n/es.json"),
9+
pt: require("./i18n/pt.json"),
10+
fr: require("./i18n/fr.json"),
11+
eo: require("./i18n/eo.json"),
12+
it: require("./i18n/it.json"),
13+
vi: require("./i18n/vi.json"),
14+
enIndian: require("./i18n/en-indian.json")
1515
};
1616
exports.i18n = i18n;
1717

@@ -27,7 +27,7 @@ for (i = 1; i <= 15; i++) {
2727

2828
writtenNumber.defaults = {
2929
noAnd: false,
30-
lang: 'en',
30+
lang: "en"
3131
};
3232

3333
/**
@@ -44,110 +44,143 @@ function writtenNumber(n, options) {
4444

4545
n = Math.round(+n);
4646

47-
var language = typeof options.lang === 'string'
47+
var language = typeof options.lang === "string"
4848
? i18n[options.lang]
4949
: options.lang;
5050
var scale = language.useLongScale ? longScale : shortScale;
5151
var units = language.units;
5252
var unit;
5353

54-
55-
56-
if (! (units instanceof Array))
57-
{
54+
if (!(units instanceof Array)) {
5855
var rawUnits = units;
59-
56+
6057
units = [];
6158
scale = Object.keys(rawUnits);
6259

63-
for (var i in scale)
64-
{
65-
units.push(rawUnits[scale[i]])
60+
for (var i in scale) {
61+
units.push(rawUnits[scale[i]]);
6662
scale[i] = Math.pow(10, parseInt(scale[i]));
6763
}
6864
}
6965

70-
71-
72-
7366
if (!language) {
7467
if (languages.indexOf(writtenNumber.defaults.lang) < 0) {
75-
writtenNumber.defaults.lang = 'en';
68+
writtenNumber.defaults.lang = "en";
7669
}
70+
7771
language = i18n[writtenNumber.defaults.lang];
7872
}
7973

8074
var baseCardinals = language.base;
8175

8276
if (language.unitExceptions[n]) return language.unitExceptions[n];
83-
if(baseCardinals[n]) return baseCardinals[n];
84-
if(n < 100) return handleSmallerThan100(n, language, unit, baseCardinals, options);
77+
if (baseCardinals[n]) return baseCardinals[n];
78+
if (n < 100)
79+
return handleSmallerThan100(n, language, unit, baseCardinals, options);
8580

8681
var m = n % 100;
8782
var ret = [];
88-
if(m) {
89-
if(options.noAnd && !(language.andException && language.andException[10])
90-
) {
91-
ret.push(writtenNumber(m, options));
83+
84+
if (m) {
85+
if (
86+
options.noAnd &&
87+
!(language.andException && language.andException[10])
88+
) {
89+
ret.push(writtenNumber(m, options));
9290
} else {
9391
ret.push(language.unitSeparator + writtenNumber(m, options));
9492
}
95-
n -= m;
96-
} else ret = [];
93+
}
94+
95+
var firstSignificant;
9796

98-
for(var i = 0, len = units.length; i < len; i++) {
97+
for (var i = 0, len = units.length; i < len; i++) {
9998
var r = Math.floor(n / scale[i]);
100-
101-
if (i == len - 1)
102-
var divideBy = 1000000;
103-
else
104-
var divideBy = scale[i+1] / scale[i];
105-
99+
var divideBy;
100+
101+
if (i === len - 1) divideBy = 1000000;
102+
else divideBy = scale[i + 1] / scale[i];
103+
106104
r %= divideBy;
107105

108106
unit = units[i];
109107

110-
if(r && unit.useBaseInstead) {
111-
if(unit.useBaseException.indexOf(r) < 0) {
108+
if (!r) continue;
109+
firstSignificant = scale[i];
110+
111+
if (unit.useBaseInstead) {
112+
var shouldUseBaseException =
113+
unit.useBaseException.indexOf(r) > -1 &&
114+
(unit.useBaseExceptionWhenNoTrailingNumbers
115+
? i === 0 && ret.length
116+
: true);
117+
if (!shouldUseBaseException) {
112118
ret.push(baseCardinals[r * scale[i]]);
113-
}
114-
else {
119+
} else {
115120
ret.push(r > 1 && unit.plural ? unit.plural : unit.singular);
116121
}
122+
continue;
117123
}
118-
else if(r) {
119-
var str;
120-
if(typeof unit === 'string') {
121-
str = unit;
122-
}
123-
else {
124-
str = r > 1 && unit.plural && (!unit.avoidInNumberPlural || !m) ? unit.plural : unit.singular;
125-
}
126-
if(unit.avoidPrefixException && unit.avoidPrefixException.indexOf(r) > -1) {
127-
ret.push(str);
128-
}
129-
else {
130-
var exception = language.unitExceptions[r];
131-
var number = exception || writtenNumber(r, util.defaults({
132-
// Languages with and exceptions need to set `noAnd` to false
133-
noAnd: !(language.andException && language.andException[r] ||
134-
unit.andException) &&
135-
true,
136-
}, options));
137-
ret.push(number + ' ' + str);
138-
}
124+
125+
var str;
126+
if (typeof unit === "string") {
127+
str = unit;
128+
} else {
129+
str = r > 1 && unit.plural && (!unit.avoidInNumberPlural || !m)
130+
? unit.plural
131+
: unit.singular;
132+
}
133+
134+
if (
135+
unit.avoidPrefixException &&
136+
unit.avoidPrefixException.indexOf(r) > -1
137+
) {
138+
ret.push(str);
139+
continue;
139140
}
140141

142+
var exception = language.unitExceptions[r];
143+
var number =
144+
exception ||
145+
writtenNumber(
146+
r,
147+
util.defaults(
148+
{
149+
// Languages with and exceptions need to set `noAnd` to false
150+
noAnd: !((language.andException && language.andException[r]) ||
151+
unit.andException) && true
152+
},
153+
options
154+
)
155+
);
156+
n -= r * scale[i];
157+
ret.push(number + " " + str);
158+
}
159+
160+
var firstSignificantN = firstSignificant * Math.floor(n / firstSignificant);
161+
var rest = n - firstSignificantN;
162+
163+
if (
164+
language.andWhenTrailing &&
165+
firstSignificant &&
166+
0 < rest &&
167+
ret[0].indexOf(language.unitSeparator) !== 0
168+
) {
169+
ret = [ret[0], language.unitSeparator.replace(/\s+$/, "")].concat(
170+
ret.slice(1)
171+
);
141172
}
142-
return ret.reverse().join(' ');
173+
174+
return ret.reverse().join(" ");
143175
}
144176

145177
function handleSmallerThan100(n, language, unit, baseCardinals, options) {
146178
var dec = Math.floor(n / 10) * 10;
147179
unit = n - dec;
148-
if(unit) {
149-
return baseCardinals[dec] + language.baseSeparator + writtenNumber(unit, options);
180+
if (unit) {
181+
return (
182+
baseCardinals[dec] + language.baseSeparator + writtenNumber(unit, options)
183+
);
150184
}
151185
return baseCardinals[dec];
152186
}
153-

lib/util.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
'use strict';
1+
"use strict";
22
/**
33
* Merges a set of default keys with a target object
44
* (Like _.defaults, but will also extend onto null/undefined)
@@ -9,10 +9,10 @@
99
*/
1010

1111
function defaults(target, defs) {
12-
if(target == null) target = {};
12+
if (target == null) target = {};
1313
var ret = {};
1414
var keys = Object.keys(defs);
15-
for(var i = 0, len = keys.length; i < len; i++) {
15+
for (var i = 0, len = keys.length; i < len; i++) {
1616
var key = keys[i];
1717
ret[key] = target[key] || defs[key];
1818
}

0 commit comments

Comments
 (0)