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" ] ;
66var 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} ;
1616exports . i18n = i18n ;
1717
@@ -27,7 +27,7 @@ for (i = 1; i <= 15; i++) {
2727
2828writtenNumber . 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
145171function 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