web-dev-qa-db-ja.com

iPhone-SDKでのさまざまな国の「通貨の小数点以下の桁数」

NSLocaleCurrencySymbolについて読みましたが、国の通貨で使用される「小数点以下の桁数」を決定するために使用される変数はどこにありますか?

I.E.米国では、小数点以下2桁で書かれた金額が一般的です:$ 1.23

他の多くの国についてはどうですか?

28
Susanna

小数点以下の桁数が異なる他の国がいくつかあります。 2が過半数、0(通貨のセントなし、日本など)が最大の少数派、3が少数で使用されています。私が知っている他の番号はありません。為替レートが引用される場合、通常はより多くの小数が使用されます。私が知っている0と3の通貨を以下に示します。

ISO通貨コードは次の場所にあります。 http://www.iso.org/iso/support/currency_codes_list-1.htmhttp://en.wikipedia.org/wiki/ISO_4217 または http://www.currency-iso.org/en/home/tables/table-a1.html =。

ISO Code           Currency Decimal places

ADP Andoran Peseta 0
AFA Afghani Afghani 0
BEF Belgian franc 0
BHD Bahraini dinar 3
BIF Burundi franc 0
BYB Belorussian rubel (old) 0
BYR Belorussian rubel (new) 0 
CLP Chilean peso 0
COP Colombian peso 0
DJF Djibouti franc 0
ECS Ecuadorian sucre 0
ESP Spanish peseta 0
GNF Guinea franc 0
GRD Greek drachma 0
HUF Hungarian forint 0
IDR Indonesian rupiah 0
IQD Iraqui dinar 3
ITL Italian lira 0
JOD Jordan dinar 3
JPY Japanese yen 0
KMF Comoros franc 0
KRW South Korean won 0
KWD Kuwaiti dinar 3
LAK Laos new kip 0
LUF Luxembourg franc 0
LYD Libyan dinar 3
MGF Madagascan franc 0
MZM Mozambique metical 0
OMR Omani rial 3
PTE Portugese escudo 0
PYG Paraguay guarani 0
ROL Roumanian Lei 0
RWF Rwanda franc 0
TJR Tadzhikistani rubel 0
TMM Turkmenistani manat 0
TND Tunesian dinar 3
TPE Timor escudo 0
TRL Turkish lira 0
TWD New Taiwan dollar 0
UGX Uganda shilling 0
VND Vietnamese dong 0
VUV Vanuata vatu 0
XAF CFA Franc BEAC 0
XOF CFA Franc BCEAO 0
XPF CFP Franc 0
32
Jorge Brana

IOS 6(およびおそらくそれ以前)では、正しいロケールに設定されたNSNumberFormatterのminimumFractionDigitsプロパティから、通貨の小数点以下の桁数を確認できます。

 void(^ currency_test)(NSString *)= ^(NSString * locale){
 NSNumberFormatter * formatter = [[NSNumberFormatter alloc] init]; 
 [formatter setLocale:[[ NSLocale alloc] initWithLocaleIdentifier:locale]]; 
 [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]; 
 NSLog(@ "%@:%@(minimumFractionDigits =%d)"、locale、[formatter stringFromNumber:@ (1000)]、[formatter minimumFractionDigits]); 
}; 
 
 currency_test(@ "en_US"); 
 currency_test(@ "nl_NL"); 
 currency_test(@ "de_DE"); 
 currency_test(@ "fr_FR"); 
 currency_test(@ "jp_JP"); 
 currency_test(@ "ar_JO") ; 
 
 en_US:$ 1,000.00(minimumFractionDigits = 2)
 nl_NL:€1.000,00(minimumFractionDigits = 2)
 de_DE:1.000,00€(minimumFractionDigits = 2 )
 jp_JP:¥1000(minimumFractionDigits = 0)
 ar_JO:١٠٠٠。٠٠٠د.أ.(minimumFractionDigits = 3)

minimumFractionDigitsプロパティに正しい値が入力される前に[formatter setNumberStyle:NSNumberFormatterCurrencyStyle]を呼び出す必要があることに注意してください(ワークアウトに30分しかかかりませんでした!)

26
Robert Atkins

http://cldr.unicode.org/

これはあなたが探しているものの多くを持っています。

1
S.Lott

Robert Atkinsの答えに基づいて、.NETでも同じことを行うことができます。このコードをテストするには、コンソールアプリプロジェクトを作成し、Program.csを次のコードに置き換えます。

using System;
using System.Globalization;
using System.Linq;

namespace ConsoleApplication
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal amount = 100.123M;

            Console.WriteLine(GetNumberOfDecimales("USD", 2));     // 2
            Console.WriteLine(GetNumberOfDecimales("EUR", 2));     // 2
            Console.WriteLine(GetNumberOfDecimales("JPY", 2));     // 0
            Console.WriteLine(GetNumberOfDecimales("BHD", 2));     // 3
            Console.WriteLine(GetNumberOfDecimales("___", 2));     // 2

            Console.WriteLine(LocalizeAmount(amount, "USD"));   // 100.12
            Console.WriteLine(LocalizeAmount(amount, "EUR"));   // 100.12
            Console.WriteLine(LocalizeAmount(amount, "JPY"));   // 100
            Console.WriteLine(LocalizeAmount(amount, "BHD"));   // 100.123
            Console.WriteLine(LocalizeAmount(amount, "___"));   // 100.12
        }

        /// <summary>
        /// 
        ///     Returns an amount with the correct number of decimals for the given currency.
        ///     The amount is rounded.
        ///     
        ///     Ex.: 
        ///         100.555 JPY => 101
        ///         100.555 USD => 100.56
        /// 
        /// </summary>
        static public string LocalizeAmount(decimal amount, string currencyCode)
        {
            var formatString = String.Concat("{0:F", GetNumberOfDecimales(currencyCode, 2), "}");      // {0:F2} for example
            return String.Format(formatString, amount);
        }

        /// <summary>
        /// 
        ///     Returns the number of decimal places for a currency.
        /// 
        ///     Ex.: 
        ///         JPY => 0
        ///         USD => 2
        ///         
        /// </summary>
        static public int GetNumberOfDecimales(string currencyCode, int defaultValue = 2)
        {
            var cultureInfo = GetFirstCultureInfoByCurrencySymbol(currencyCode);
            return cultureInfo?.NumberFormat?.CurrencyDecimalDigits ?? defaultValue;
        }

        static private CultureInfo GetFirstCultureInfoByCurrencySymbol(string currencySymbol)
        {
            if (string.IsNullOrWhiteSpace(currencySymbol))
                throw new ArgumentNullException("A valid currency must be provided.");

            return CultureInfo.GetCultures(CultureTypes.SpecificCultures)
                              .FirstOrDefault(x => new RegionInfo(x.LCID).ISOCurrencySymbol == currencySymbol);
        }
    }
}
1