forked from smirzaei/currency-formatter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
124 lines (109 loc) · 3.35 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
var accounting = require('accounting')
var assign = require('object-assign')
var localeCurrency = require('locale-currency')
var currencies = require('./currencies.json')
var localeFormats = require('./localeFormats.json')
var defaultCurrency = {
symbol: '',
thousandsSeparator: ',',
decimalSeparator: '.',
symbolOnLeft: true,
spaceBetweenAmountAndSymbol: false,
decimalDigits: 2
}
var defaultLocaleFormat = {}
var formatMapping = [
{
symbolOnLeft: true,
spaceBetweenAmountAndSymbol: false,
format: {
pos: '%s%v',
neg: '-%s%v',
zero: '%s%v'
}
},
{
symbolOnLeft: true,
spaceBetweenAmountAndSymbol: true,
format: {
pos: '%s %v',
neg: '-%s %v',
zero: '%s %v'
}
},
{
symbolOnLeft: false,
spaceBetweenAmountAndSymbol: false,
format: {
pos: '%v%s',
neg: '-%v%s',
zero: '%v%s'
}
},
{
symbolOnLeft: false,
spaceBetweenAmountAndSymbol: true,
format: {
pos: '%v %s',
neg: '-%v %s',
zero: '%v %s'
}
}
]
function format(value, options) {
var code = options.code || (options.locale && localeCurrency.getCurrency(options.locale))
var localeMatch = /^([a-z]+)([_-]([a-z]+))?$/i.exec(options.locale) || []
var language = localeMatch[1]
var region = localeMatch[3]
var localeFormat = assign({}, defaultLocaleFormat,
localeFormats[language] || {},
localeFormats[language + '-' + region] || {})
var currency = assign({}, defaultCurrency, findCurrency(code), localeFormat)
var symbolOnLeft = currency.symbolOnLeft
var spaceBetweenAmountAndSymbol = currency.spaceBetweenAmountAndSymbol
var format = formatMapping.filter(function(f) {
return f.symbolOnLeft == symbolOnLeft && f.spaceBetweenAmountAndSymbol == spaceBetweenAmountAndSymbol
})[0].format
return accounting.formatMoney(value, {
symbol: isUndefined(options.symbol)
? currency.symbol
: options.symbol,
decimal: isUndefined(options.decimal)
? currency.decimalSeparator
: options.decimal,
thousand: isUndefined(options.thousand)
? currency.thousandsSeparator
: options.thousand,
precision: typeof options.precision === 'number'
? options.precision
: currency.decimalDigits,
format: ['string', 'object'].indexOf(typeof options.format) > -1
? options.format
: format
})
}
function findCurrency (currencyCode) {
return currencies[currencyCode]
}
function isUndefined (val) {
return typeof val === 'undefined'
}
function unformat(value, options) {
var code = options.code || (options.locale && localeCurrency.getCurrency(options.locale))
var localeFormat = localeFormats[options.locale] || defaultLocaleFormat
var currency = assign({}, defaultCurrency, findCurrency(code), localeFormat)
var decimal = isUndefined(options.decimal) ? currency.decimalSeparator : options.decimal
return accounting.unformat(value, decimal)
}
module.exports = {
defaultCurrency: defaultCurrency,
get currencies() {
// In favor of backwards compatibility, the currencies map is converted to an array here
return Object.keys(currencies).map(function(key) {
return currencies[key]
})
},
findCurrency: findCurrency,
format: format,
unformat: unformat
}