# Copyright 2014 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:
#  cldrVersion=25
#  date=$Date: 2014-02-25 22:16:49 +0100 (Tue, 25 Feb 2014) $
#  number=$Revision: 9791 $
#  type=ms
AED = Dirham Emiriah Arab Bersatu
AFN = Afghani Afghanistan||0
ALL = Lek Albania||0
AMD = Dram Armenia||0
ANG = Guilder Antillean Netherland
AOA = Kwanza Angola
ARS = Peso Argentina
AUD = Dolar Australia|$
AWG = Florin Aruba
AZN = Manat Azerbaijan
BAM = Mark Boleh Tukar Bosnia-Herzegovina
BBD = Dolar Barbados
BDT = Taka Bangladesh|৳
BGN = Lev Bulgaria
BHD = Dinar Bahrain||3
BIF = Franc Burundia||0
BMD = Dolar Bermuda|$
BND = Dolar Brunei
BOB = Boliviano Bolivia
BRL = Real Brazil|R$
BSD = Dolar Bahamas|$
BTN = Ngultrum Bhutan
BWP = Pula Botswana
BYR = Ruble Belarus||0
BZD = Dolar Belize|$
CAD = Dolar Kanada|CA$
CDF = Franc Congo
CHF = Franc Switzerland
CLP = Peso Chile|$|0
CNY = Yuan Cina|¥
COP = Peso Colombia||0
CRC = Colon Costa Rica||0
CUC = Peso Boleh Tukar Cuba
CUP = Peso Cuba|$
CVE = Escudo Tanjung Verde
CZK = Koruna Republik Czech
DJF = Franc Djibouti||0
DKK = Krone Denmark
DOP = Peso Dominican|$
DZD = Dinar Algeria
EGP = Paun Mesir
ETB = Birr Ethiopia
EUR = Euro|€
FJD = Dolar Fiji
FKP = Paun Kepulauan Falkland
GBP = Paun Sterling British|£
GEL = Lari Georgia
GHS = Cedi Ghana
GIP = Paun Gibraltar|£
GMD = Dalasi Gambia
GNF = Franc Guinea||0
GTQ = Quetzal Guatemala
GYD = Dolar Guyana||0
HKD = Dolar Hong Kong|$
HNL = Lempira Honduras
HRK = Kuna Croatia
HTG = Gourde Haiti
HUF = Forint Hungary||0
IDR = Rupiah Indonesia||0
ILS = Sheqel Baru Israel|₪
INR = Rupee India|₹
IQD = Dinar Iraq||0
IRR = Rial Iran||0
ISK = Krona Iceland||0
JMD = Dolar Jamaica
JOD = Dinar Jordan||3
JPY = Yen Jepun|¥|0
KES = Syiling Kenya
KGS = Som Kyrgystani
KHR = Riel Kemboja
KMF = Franc Comoria||0
KPW = Won Korea Utara||0
KRW = Won Korea Selatan|₩|0
KWD = Dinar Kuwait||3
KYD = Dolar Kepulauan Cayman|$
KZT = Tenge Kazakhstan|₸
LAK = Kip Laos||0
LBP = Paun Lubnan||0
LKR = Rupee Sri Lanka
LRD = Dolar Liberia
LSL = Loti Lesotho
LTL = Litas Lithuania
LVL = Lats Latvia|||1
LYD = Dinar Libya||3
MAD = Dirham Maghribi
MDL = Leu Moldova
MGA = Ariary Malagasy||0
MKD = Denar Macedonia
MMK = Kyat Myanma||0
MNT = Tugrik Mongolia||0
MOP = Pataca Macau
MRO = Ouguiya Mauritania||0
MUR = Rupee Mauritia||0
MVR = Rufiyaa Maldives
MWK = Kwacha Malawi
MXN = Peso Mexico|$
MYR = Ringgit Malaysia|RM
MZN = Metikal Mozambique
NAD = Dolar Namibia|$
NGN = Naira Nigeria
NIO = Cordoba Nicaragua
NOK = Krone Norway
NPR = Rupee Nepal
NZD = Dolar New Zealand|$
OMR = Rial Oman||3
PAB = Balboa Panama
PEN = Nuevo Sol Peru
PGK = Kina Papua New Guinea
PHP = Peso Filipina
PKR = Rupee Pakistan||0
PLN = Zloty Poland
PYG = Guarani Paraguay|₲|0
QAR = Rial Qatar
RON = Leu Romania
RSD = Dinar Serbia||0
RUB = Ruble Rusia
RWF = Franc Rwanda||0
SAR = Riyal Saudi
SBD = Dolar Kepulauan Solomon|$
SCR = Rupee Seychelles
SDG = Paun Sudan
SEK = Krona Sweden
SGD = Dolar Singapura|$
SHP = Paun Saint Helena
SLL = Leone Sierra Leone||0
SOS = Syiling Somali||0
SRD = Dolar Surinam
SSP = Paun Sudan selatan|£
STD = Dobra Sao Tome dan Principe||0
SYP = Paun Syria||0
SZL = Lilangeni Swazi
THB = Baht Thai|฿
TJS = Somoni Tajikistan
TMT = Manat Turkmenistan
TND = Dinar Tunisia||3
TOP = Tongan Paʻanga
TRY = Lira Turki
TTD = Dolar Trinidad dan Tobago|$
TWD = Dolar Taiwan Baru|NT$
TZS = Syiling Tanzania||0
UAH = Hryvnia Ukraine|₴
UGX = Syiling Uganda||0
USD = Dolar AS|$
UZS = Som Uzbekistan||0
VEF = Bolivar Venezuela
VND = Dong Vietnam|₫|0
VUV = Vatu Vanuatu||0
WST = Tala Samoa
XAF = Franc CFA BEAC|FCFA|0
XCD = Dolar Caribbean Timur|EC$
XOF = Franc CFA BCEAO|CFA|0
XPF = Franc CFP|CFPF|0
XXX = Mata Wang Tidak Diketahui|||1
YER = Rial Yaman||0
ZAR = Rand Afrika Selatan
ZMK = Kwacha Zambia (1968–2012)||0|1
ZMW = Kwacha Zambia
