有没有一种方法可以为一个国家格式化正确的货币表示方式?
例如:
- 英国 -£127.54
- 荷兰 € 127,54-
- 美国 $127.54
等等。
需要考虑以下几点:
货币符号
货币符号的位置 -- 可以放在数字前或后。
负数显示方式
有没有一种方法可以为一个国家格式化正确的货币表示方式?
例如:
等等。
需要考虑以下几点:
货币符号
货币符号的位置 -- 可以放在数字前或后。
负数显示方式
尝试使用货币格式说明符(“C”),可以通过String.Format
或数值类型的重载ToString
方法使用。该说明符会自动考虑当前 UI 区域设置,并相应地显示货币值。
例如:
这里提供更多详细信息。
decimal value = 12345.6789M; // Be sure to use Decimal for money values. Do not use IEEE-754 types such as float (System.Single) and double (System.Double) as they can only store approximate values.
Console.WriteLine(value.ToString("C", CultureInfo.CurrentCulture));
Console.WriteLine(value.ToString("C3", CultureInfo.CurrentCulture));
Console.WriteLine(value.ToString("C3", CultureInfo.CreateSpecificCulture("da-DK")));
// The example displays the following output on a system whose
// current culture is English (United States):
// $12,345.68
// $12,345.679
// kr 12.345,679
这种功能已经内置。
在使用十进制数时,您可以使用格式化字符串"C"或"c"。(格式化字符串链接)
decimal dec = 123.00M;
string uk = dec.ToString("C", new CultureInfo("en-GB")); // uk holds "£123.00"
string us = dec.ToString("C", new CultureInfo("en-US")); // us holds "$123.00"
使用.ToString("C", culture)将一个给定的数值显示为货币格式的问题在于它会将数值转换为指定文化中默认的货币。如果你有一个数值,该数值对应的ISO货币代码,并且想要在指定文化中显示它,我建议创建一个类似下面所示的十进制扩展方法。这样不会自动假设货币是指定文化中的默认货币:
public static string ToFormattedCurrencyString(
this decimal currencyAmount,
string isoCurrencyCode,
CultureInfo userCulture)
{
var userCurrencyCode = new RegionInfo(userCulture.Name).ISOCurrencySymbol;
if (userCurrencyCode == isoCurrencyCode)
{
return currencyAmount.ToString("C", userCulture);
}
return string.Format(
"{0} {1}",
isoCurrencyCode,
currencyAmount.ToString("N2", userCulture));
}
这将使用本地货币符号或ISO货币代码与金额,以更合适的方式进行显示。有关此主题的更多信息,请参阅此博客文章。
如果您只有货币符号和小数位数,您可以使用以下辅助函数。该函数尊重符号/金额顺序、分隔符等,仅更改货币符号本身和要显示的小数位数。
public static string FormatCurrency(string currencySymbol, Decimal currency, int decPlaces)
{
NumberFormatInfo localFormat = (NumberFormatInfo)NumberFormatInfo.CurrentInfo.Clone();
localFormat.CurrencySymbol = currencySymbol;
localFormat.CurrencyDecimalDigits = decPlaces;
return currency.ToString("c", localFormat);
}
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB",false);
Console.WriteLine("bbbbbbb {0:c}",4321.2);
Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US",false);
Console.WriteLine("bbbbbbb {0:c}",4321.2);
将显示-
bbbbbbb £4,321.20
bbbbbbb $4,321.20
获取文化名称列表,例如 en-GB、en-US 等等。
http://msdn.microsoft.com/zh-cn/library/system.globalization.cultureinfo(v=vs.80).aspx
有时候你可能根本无法使用文化方法,例如当你想要独立于任何文化或货币进行特定格式化时。即使是@jackjgordon的方法也不可靠,因为一些文化具有不同的数字格式和货币格式,导致不一致。
这里有一个手动格式化程序,可以独立地格式化您的数字,而不需要任何文化支持。
public static class CustomNumberFormatExtensions
{
static readonly StringBuilder formatTextBuilder = new StringBuilder();
public static string ToCustomFormattedString(this decimal d, int decimalPrecision, string decimalPoint, string groupSeperator = "", int groupLength = 3, MidpointRounding rounding = MidpointRounding.AwayFromZero)
{
lock (formatTextBuilder)
{
formatTextBuilder.Clear();
string rawDigits = Math.Round(d * (decimal)Math.Pow(10, decimalPrecision), 0, rounding).ToString();
rawDigits = rawDigits.PadLeft(decimalPrecision + 1, '0');
if (decimalPrecision > 0)
{
formatTextBuilder.Insert(0, rawDigits.Substring(rawDigits.Length - decimalPrecision));
rawDigits = rawDigits.Substring(0, rawDigits.Length - decimalPrecision);
formatTextBuilder.Insert(0, decimalPoint);
}
while (rawDigits.Length > groupLength)
{
formatTextBuilder.Insert(0, rawDigits.Substring(rawDigits.Length - groupLength));
rawDigits = rawDigits.Substring(0, rawDigits.Length - groupLength);
formatTextBuilder.Insert(0, groupSeperator);
}
return rawDigits + formatTextBuilder.ToString();
}
}
public static string ToCustomFormattedString(this double d, int decimalPrecision, string decimalSeperator, string groupSeperator = "", int groupLength = 3, MidpointRounding rounding = MidpointRounding.AwayFromZero)
{
return ((decimal)d).ToCustomFormattedString(decimalPrecision, decimalSeperator, groupSeperator, groupLength, rounding);
}
}
public static string ToFormattedCurrencyString(
this decimal currencyAmount,
string isoCurrencyCode,
CultureInfo userCulture)
{
var userCurrencyCode = new RegionInfo(userCulture.Name).ISOCurrencySymbol;
if (userCurrencyCode == isoCurrencyCode)
{
return currencyAmount.ToString("C", userCulture);
}
return string.Format(
"{0} {1}",
isoCurrencyCode,
currencyAmount.ToString("N2", userCulture));
}