# Copyright 2012 Google Inc.
# 
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
# 
# http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

#
# The key is an ISO4217 currency code, and the value is of the form:
#   display name|symbol|decimal digits|not-used-flag|rounding
# If a symbol is not supplied, the currency code will be used
# If # of decimal digits is omitted, 2 is used
# If a currency is not generally used, not-used-flag=1
# If a currency should be rounded to a multiple of of the least significant
#   digit, rounding will be present
# Trailing empty fields can be omitted

# DO NOT EDIT - GENERATED FROM CLDR DATA
AFA = Afeghani (1927–2002)|||1
AFN = Afegani do Afeganistão||0
ALL = lek albanês||0
AMD = Dram arménio
AOA = kwanza angolano
ARS = peso argentino
AWG = florim de Aruba
AZN = Manat do Azerbaijão
BAD = Dinar da Bósnia-Herzegóvina|||1
BAM = marco bósnio-herzegóvino conversível
BBD = dólar barbadense
BDT = Taka de Bangladesh
BEC = Franco belga (convertível)|||1
BGN = lev búlgaro
BHD = Dinar baremita||3
BIF = franco burundiano||0
BMD = dólar bermudense
BND = Dólar bruneíno
BOB = boliviano
BRL = real brasileiro|R$
BSD = dólar das Bahamas
BTN = Ngultrum do Butão
BWP = Pula de Botswana
BYB = Rublo novo bielorusso (1994–1999)|||1
BYN = rublo bielorrusso
BZD = dólar belizense
CAD = dólar canadiano|CA$
CDF = franco congolês
CHF = franco suíço
CLP = peso chileno||0
CNH = yuan offshore|||1
CNY = yuan|CN¥
COP = peso colombiano
CRC = colon costa-riquenho
CUC = peso cubano conversível
CUP = peso cubano
CVE = escudo cabo-verdiano
CYP = Libra de Chipre|||1
CZK = coroa checa
DJF = franco jibutiano||0
DKK = coroa dinamarquesa
DZD = dinar argelino
ECV = Unidad de Valor Constante (UVC) do Equador|||1
EGP = libra egípcia
ERN = nakfa eritreia
ETB = birr etíope
EUR = euro|€
FJD = Dólar de Fiji
FKP = libra das Ilhas Falkland
GBP = libra esterlina britânica|£
GHC = Cedi do Gana|||1
GHS = cedi ganês
GIP = libra de Gibraltar
GMD = dalasi gambiano
GNF = franco guineense||0
GTQ = quetzal da Guatemala
GYD = dólar da Guiana
HNL = lempira das Honduras
HRK = kuna croata
HUF = forint húngaro
ILS = Sheqel novo israelita|₪
ISK = coroa islandesa||0
KES = xelim queniano
KGS = Som do Quirguistão
KMF = franco comoriano||0
KYD = Dólar das Ilhas Caimão
KZT = Tenge do Cazaquistão
LAK = Kip de Laos||0
LRD = dólar liberiano
LTL = Litas da Lituânia|||1
LVL = Lats da Letónia|||1
LYD = dinar líbio||3
MAD = dirham marroquino
MDL = leu moldavo
MGA = ariari malgaxe||0
MKD = dinar macedónio
MLF = Franco do Mali|||1
MMK = Kyat de Mianmar||0
MNT = Tugrik da Mongólia
MRO = ouguiya mauritana (1973–2017)||0|1
MRU = ouguiya mauritana
MUR = rupia mauriciana
MVR = Rupia das Ilhas Maldivas
MWK = kwacha malauiano
MXN = peso mexicano|MX$
MXP = Peso Plata mexicano (1861–1992)|||1
MXV = Unidad de Inversion (UDI) mexicana|||1
MZN = metical moçambicano|MTn
NAD = Dólar da Namíbia
NIC = Córdoba nicaraguano (1988–1991)|||1
NIO = córdoba nicaraguano
NOK = coroa norueguesa
OMR = Rial de Omã||3
PAB = balboa do Panamá
PEN = sol peruano
PGK = Kina da Papua-Nova Guiné
PLN = zloti polaco
PLZ = Zloti polaco (1950–1995)|||1
PTE = Escudo português|​||1
PYG = guarani paraguaio||0
QAR = Rial do Catar
RON = leu romeno
RSD = dinar sérvio||0
RUB = rublo russo
RWF = franco ruandês||0
SAR = Rial saudita
SCR = rupia seichelense
SDG = libra sudanesa
SEK = coroa sueca
SGD = Dólar de Singapura
SHP = libra santa-helenense
SOS = xelim somali||0
SRD = dólar do Suriname
SSP = libra sul-sudanesa
STN = dobra de São Tomé e Príncipe
SZL = Lilangeni da Suazilândia
THB = Baht da Tailândia|฿
TJS = Somoni do Tajaquistão
TMT = Manat do Turquemenistão
TND = dinar tunisino||3
TOP = Paʻanga de Tonga
TTD = Dólar de Trindade e Tobago
UAH = hryvnia ucraniano
USD = dólar dos Estados Unidos|US$
UYU = peso uruguaio
UZS = Som do Uzbequistão
VEF = bolívar (2008–2018)|||1
VES = bolívar
XAF = franco CFA (BEAC)|FCFA|0
XCD = Dólar das Caraíbas Orientais|EC$
XEU = Unidade da Moeda Europeia|||1
XOF = franco CFA (BCEAO)|CFA|0
XXX = moeda desconhecida|¤||1
YUD = Dinar forte jugoslavo|||1
YUM = Super Dinar jugoslavo|||1
YUN = Dinar conversível jugoslavo|||1
ZMK = Kwacha zambiano (1968–2012)||0|1
ZWD = Dólar do Zimbabwe||0|1
