本页内容
概述和说明
Win32 中的货币格式设置
.NET Framework 中的货币格式设置
网页中的货币格式设置
引用
概述和说明
货币格式设置需要考虑以下这些元素:
- 货币符号 -- 这可以是一个预定义的符号(如欧洲欧元 '€'),也可以是字母组合(如英镑使用的 'GBP')。
- 货币符号位置 -- 它可以在数字前也可以在数字后。
- 负额显示 -- 有以下几种用来显示负额的方式:
说明
大多数货币采用区域设置中的数字所用的小数和千位分隔符,但也有一些特殊情况。在瑞士的一些地方,它们使用句点作为瑞士法郎的小数分隔符 (Sfr.127.54),但在其他地方使用逗号作为小数分隔符 (127,54)。
图 1:“区域选项”中的货币格式设置
返回页首
Win32 中的货币格式设置
Win32 NLS API 可以帮助您以识别区域设置的方式显示货币数据。GetCurrencyFormat 函数将数字字符串格式化为指定区域设置的货币字符串。下页中的代码示例将数字字符串格式化为用户区域设置的默认格式:
GetCurrencyFormat(LOCALE_USER_DEFAULT, // a predefined value for user locale
NULL, // operation option
TEXT("123.40"), // input number (see MSDN for accepted chars)
NULL, // formatting specifications
g_szTemp, // output buffer
MAX_STR); // size of output buffer
针对英语(美国)和丹麦语用户区域设置执行上述代码将分别得到以下结果。(请参见图 2)。
图 2 - 适用于英语(美国)和丹麦语的货币格式。
通过这种方法,数字字符串被格式化为特定于区域设置的格式和更为重要的货币符号!但是,假设您希望向丹麦语用户显示 $1,230.40(美国美元)。通过使用介绍的第一种方法并使用当前用户区域设置(丹麦语)格式化字符串,您的字符串实际上将显示为 kr 1.230,40。当然,主要问题在于您想要以丹麦语格式设置字符串的格式,但并不想改变货币符号(否则会损失一部分货币价值)。
另一种情形是使用欧元作为比利时、德国、西班牙、法国、爱尔兰、意大利、卢森堡、荷兰、奥地利、葡萄牙、芬兰和希腊的官方货币。(此列表从 2002 年 1 月 1 日开始生效。)对于这十二个使用欧元作为官方货币的国家,.NET Framework 和 Windows XP 将默认货币符号设置为欧元。但在旧版的 Windows 中,以上这些国家或地区的默认货币符号仍被设置为当地货币,并无任何变化。要解决刚刚提到的两种情形中所存在的问题,您可以利用 GetCurrencyFormat 的 lpFormat 参数。此参数是一个指向货币格式设置结构的指针,您可在其中依照给定区域设置的格式设置标准定义自己的格式设置模型并指定要使用的货币符号。以下代码示例使用当前选定用户区域设置的格式,但以欧元作为所需的货币符号。下面是它的工作原理。
CURRENCYFMT CurFormat;
// First fill in the CURRENCYFMT structure with user locale-specific information.
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_RETURN_NUMBER|LOCALE_IDIGITS,
&CurFormat.NumDigits, STR_LEN);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_RETURN_NUMBER|LOCALE_ILZERO,
CurFormat.LeadingZero, STR_LEN);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SGROUPING,
&CurFormat.Grouping, STR_LEN);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_SDECIMAL,
&CurFormat.lpDecimalSep, STR_LEN);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_STHOUSAND,
&CurFormat.lpThousandSep, STR_LEN);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_RETURN_NUMBER|LOCALE_INEGCURR,
CurFormat.NegativeOrder, STR_LEN);
GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_RETURN_NUMBER|LOCALE_ICURRENCY,
CurFormat.PositiveOrder, STR_LEN);
// Set euro as the default currency symbol.
CurFormat.lpCurrencySymbol = TEXT("€");
GetCurrencyFormat(LOCALE_USER_DEFAULT, // a predefined value for user locale
0, // operation option
TEXT("123.40"), // input number (see MSDN for legal chars)
&CurFormat, // formatting specifications
g_szTemp, // output buffer
MAX_STR); // size of output buffer
通过执行此代码,丹麦语区域设置(以 kr 作为默认货币符号)的货币符号格式设置结果将为:€ 123,40
返回页首
.NET Framework 中的货币格式设置
如果您想要将某一标准 .NET Framework 数据类型转换为以其他某种格式显示该类型的字符串,.NET 格式字符串将十分有用。例如,如果您想要将整数值 100 以货币值形式显示给用户,您可以轻松使用 ToString 方法和货币格式字符串 ("C") 来生成字符串 "$100.00"。没有将英语(美国)指定为当前区域性的计算机将显示当前区域性使用的任何货币表示法。不会转换数据类型中包含的初始值,但返回表示结果值的新字符串。这一新字符串只有转换回 .NET 基本数据类型,才能用于计算。但随时都可以计算初始值。
在以下代码示例中,ToString 方法在控制台的输出窗口中将值 100 显示为货币格式字符串。
int MyInt = 100;
String MyString = MyInt.ToString("C");
Console.WriteLine(MyString);
在将英语(美国)设置为其当前区域性的计算机上,此代码将在控制台中显示 $100.00。
RegionInfo 类(来自 System.Globalization 命名空间)的 CurrencySymbol 属性可用于检索与国家或地区相关的货币符号。另外,RegionInfo 的 ISOCurrencySymbol 属性会检索与国家或地区相关的三字符 ISO 4217 货币符号。
至于之前提到的欧元挑战,再次重申,欧元现在是十二个欧洲国家的默认货币符号,但只有 Windows XP 将此货币符号设置为受影响国家的默认值。在此前的平台(包括 Windows 2000)上,必须由用户手动设置该值。如果您希望确保您的应用程序使用 .NET Framework 的默认设置并使用欧元作为默认货币符号(无论用户设置为何),则必须创建 CultureInfo 对象,传递设置为 false 的 useUserOverride 参数。
以下示例使用的代码与前一示例相似。它将当前区域性设置为 "fr-FR",并以货币格式将整数显示在控制台中。使用用户的当地货币设置来设置货币的格式。接下来,使用 CultureInfo 构造函数(接受已设置为 false 的 useUserOverride 参数)将区域性设置为 "fr-FR"。然后使用 .NET Framework 默认设置格式化数字,并显示欧元货币符号。
using System;
using System.Globalization;
using System.Threading;
public class EuroSymbolSample
{
public static void Main()
{
int i = 100;
// Set the CurrentCulture to French in France.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
// Display i formatted as default currency for the
// CurrentCulture.
// On a version of Windows prior to Windows XP, where the user
// has not changed the default currency to euro through
// Control Panel, this will default to "F".
Console.WriteLine(i.ToString("c"));
// Set the CurrentCulture to French in France, using the
// CultureInfo constructor that takes a useUserOverride
// parameter.
// Set the useUserOverride value to false.
Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR", false);
// Display i formatted as default currency for the
// CurrentCulture.
// On a version of Windows prior to Windows XP, this will
// override an incorrect default setting of "F" and display
// the euro symbol (i).
Console.WriteLine(i.ToString("c"));
}
}
如果您在 Windows 窗体应用程序中执行此代码,输出将如下所示:
尽管大多数欧盟国家现在使用欧元,但在某些情况下(如出于承袭原因),必须在应用程序中同时显示欧元和旧版货币。以下代码示例针对区域性 "fr-FR"(默认货币为欧元)创建 CultureInfo 对象。要显示当地货币的货币符号,必须使用 NumberFormatInfo.Clone 方法为 CultureInfo 对象复制一个新的 NumberFormatInfo 对象,并用当地货币符号替换默认货币符号。
using System;
using System.Globalization;
using System.Threading;
public class EuroLocalSample
{
public static void Main()
{
// Create a CultureInfo object for French in France.
CultureInfo FrCulture = new CultureInfo("fr-FR");
// 将 CurrentCulture 设置为 fr-FR。
Thread.CurrentThread.CurrentCulture = FrCulture;
// Clone the NumberFormatInfo object and create
// a new object for the local currency of France.
NumberFormatInfo LocalFormat =
(NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
// Replace the default currency symbol with the local
// currency symbol.
LocalFormat.CurrencySymbol = "F";
int i = 100;
// Display i formatted as the local currency.
Console.WriteLine(i.ToString("c", LocalFormat));
// Display i formatted as the default currency.
Console.WriteLine(i.ToString("c", NumberFormatInfo.CurrentInfo));
}
}
返回页首
网页中的货币格式设置
在本章前面的“在网页中检索浏览器语言设置”中,您已经看到了如何在客户端检索当前浏览器区域设置以及如何将您上下文或会话的全局区域设置设置为该值。完成相应的区域设置之后,您便可以使用 FormatCurrency(一个可识别区域设置的函数)轻松设置货币的格式。假设您检索到保加利亚语是浏览器的主要区域设置("bg" 是此区域设置的默认值)。以下代码将保存当前的上下文区域设置(与服务器的用户区域设置相匹配),将此区域设置设定为保加利亚语,用保加利亚语格式设置日期格式并还原初始区域设置。
currentLocale = GetLocale
Original = SetLocale("bg")
DateData = FormatCurrency(3943.23)
Original = SetLocale(currentLocale)
输出将为:3 943,23
显然,在 Win32 编程中,脚本技术在处理货币格式时并不像 NLS API 那样灵活。但是,FormatCurrency 函数允许您以短货币格式和长货币格式显示用户区域性首选项的货币。
返回页首
引用