1- ' use strict' ;
1+ " use strict" ;
22exports = 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" ] ;
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,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
145177function 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-
0 commit comments