各国的“货币小数位数宽度”在 iPhone-SDK 中

发布于 2024-08-30 05:32:15 字数 132 浏览 4 评论 0原文

我读到了有关 NSLocaleCurrencySymbol 的内容,但是我在哪里可以找到用于确定国家货币中使用的“小数位数”的变量?

IE 在美国,常见的是用两位小数书写的美元金额: $1.23

那么许多其他国家呢?

I read about NSLocaleCurrencySymbol, but where would I find the variable used to determine the "number of decimal places" used in a country's currency?

I.E. In the USA, it's common to see dollar amounts written with 2 decimal places: $1.23

What about many other countries?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

℡Ms空城旧梦 2024-09-06 05:32:15

还有许多其他国家/地区显示不同的小数位数。 2 是大多数,0(其货币中没有美分,例如日本)是最大的少数,3 仅在少数中使用。据我所知,没有其他号码了。当报价时,通常会使用更多的小数点。我所知道的带有 0 和 3 的货币如下所示。

ISO 货币代码可在以下位置找到:http://www.iso .org/iso/support/currency_codes_list-1.htm http://en .wikipedia.org/wiki/ISO_4217http: //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

There are a number of other countries that display a different number of decimal places. 2 is the majority, 0 (no cents in their currency, e.g., Japan) is the largest minority, 3 is used in just a few. No other number that I know off. When exchange rates are quoted, more decimals are typically used. The currencies with 0 and 3 that I'm aware of are shown below.

The ISO currency codes can be found at: http://www.iso.org/iso/support/currency_codes_list-1.htm http://en.wikipedia.org/wiki/ISO_4217 or 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
无风消散 2024-09-06 05:32:15

在 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)

请注意,您必须调用 [formatter setNumberStyle:NSNumberFormatterCurrencyStyle]minimumFractionDigits 属性填充正确的值之前(我只花了半个小时就搞定了!)

In iOS 6 (and possibly earlier) you can find out the number of digits after the decimal place of a currency from the minimumFractionDigits property of an NSNumberFormatter set to the correct locale:

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)

Note that you must call [formatter setNumberStyle:NSNumberFormatterCurrencyStyle] before the minimumFractionDigits property is populated with the correct value (that one only took me half an hour to work out!)

爱你是孤单的心事 2024-09-06 05:32:15

http://cldr.unicode.org/

这里有很多你正在寻找的东西。

http://cldr.unicode.org/

This has much of what you're looking for.

等风也等你 2024-09-06 05:32:15

根据 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);
        }
    }
}

Bulding on Robert Atkins' answer, it is possible to do the same thing on .NET. To test this code, create a Console App project and replace Program.cs with this:

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);
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文