Skip to content

Commit 23c409e

Browse files
committed
Fix issues with portuguese #38
Not very clean.
1 parent 694f18d commit 23c409e

File tree

4 files changed

+379
-314
lines changed

4 files changed

+379
-314
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: 97 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
1-
'use strict';
2-
exports = module.exports = writtenNumber;
3-
var util = require('./util');
1+
"use strict";
2+
exports = (module.exports = writtenNumber);
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,137 @@ 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 && !(language.andException && language.andException[10])
87+
) {
88+
ret.push(writtenNumber(m, options));
9289
} else {
9390
ret.push(language.unitSeparator + writtenNumber(m, options));
9491
}
95-
n -= m;
96-
} else ret = [];
92+
}
93+
94+
var firstSignificant;
9795

98-
for(var i = 0, len = units.length; i < len; i++) {
96+
for (var i = 0, len = units.length; i < len; i++) {
9997
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-
98+
var divideBy;
99+
100+
if (i === len - 1) divideBy = 1000000;
101+
else divideBy = scale[i + 1] / scale[i];
102+
106103
r %= divideBy;
107104

108105
unit = units[i];
109106

110-
if(r && unit.useBaseInstead) {
111-
if(unit.useBaseException.indexOf(r) < 0) {
107+
if (!r) continue;
108+
firstSignificant = scale[i];
109+
110+
if (unit.useBaseInstead) {
111+
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 && unit.avoidPrefixException.indexOf(r) > -1
136+
) {
137+
ret.push(str);
138+
continue;
139139
}
140140

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

145171
function handleSmallerThan100(n, language, unit, baseCardinals, options) {
146172
var dec = Math.floor(n / 10) * 10;
147173
unit = n - dec;
148-
if(unit) {
149-
return baseCardinals[dec] + language.baseSeparator + writtenNumber(unit, options);
174+
if (unit) {
175+
return baseCardinals[dec] +
176+
language.baseSeparator +
177+
writtenNumber(unit, options);
150178
}
151179
return baseCardinals[dec];
152180
}
153-

0 commit comments

Comments
 (0)