我读到了有关NSLocaleCurrencySymbol的信息,但在哪里可以找到用于确定某个国家/地区货币中使用的“小数位数”的变量?
即。在美国,通常会看到以小数点后2位写入的美元金额:1.23美元
许多其他国家呢?
答案 0 :(得分:32)
还有许多其他国家/地区显示不同的小数位数。 2是多数,0(他们的货币没有美分,例如日本)是最大的少数,3只用于少数。没有其他我知道的号码。当引用汇率时,通常使用更多小数。我知道的0和3货币如下所示。
可以在以下位置找到ISO货币代码: http://www.iso.org/iso/support/currency_codes_list-1.htm http://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
答案 1 :(得分:26)
在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] (那个只花了我半小时才能完成!)
答案 2 :(得分:1)
这有很多你想要的东西。
答案 3 :(得分:1)
根据罗伯特·阿特金斯(Robert Atkins)的回答,可以在.NET上执行相同的操作。要测试此代码,请创建一个Console App项目,并用以下代码替换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);
}
}
}