C#的字符串货币格式可以选择最多6个十进制数字吗?

时间:2014-01-22 14:09:11

标签: c# localization

使用快速测试C#的货币格式似乎不支持可选的小数位。

CultureInfo ci = new CultureInfo("en-US");
String.Format(ci, "{0:C2}", number); // Always 2 decimals
String.Format(ci, "{0:C6}", number); // Always 6 decimals

尝试自定义它不起作用。

String.Format(ci, "{0:C0.00####}", number); // two decimals always, 4 optional

是否可以使用带有可选小数位数的货币格式?

e.g。 $ 199.99或$ 0.009999或$ 5.00就像这样显示。

2 个答案:

答案 0 :(得分:1)

我不确定使用C是否有直接方法可以做到这一点,但您可以这样做:

decimal number = 1M;
CultureInfo ci = new CultureInfo("en-US");
string formattedValue = string.Format("{0}{1}", 
                                    ci.NumberFormat.CurrencySymbol, 
                                    number.ToString("0.00####")); 

答案 1 :(得分:1)

这有点啰嗦,但你可以先计算小数位数。然后,您可以使用该数字来形成格式字符串。

你需要这个实用功能(以Joe的名义去找一个人):

private int CountDecimalPlaces(decimal value)
{
    value = decimal.Parse(value.ToString().TrimEnd('0'));
    return BitConverter.GetBytes(decimal.GetBits(value)[3])[2];
}

然后你可以沿着这些方向做点什么:

decimal number = 5.0M;

CultureInfo ci = CultureInfo.CurrentCulture;

NumberFormatInfo nfi = ci.NumberFormat.Clone() as NumberFormatInfo;

// Count the decimal places, but default to at least 2 decimals
nfi.CurrencyDecimalDigits = Math.Max(2 , CountDecimalPlaces(number));

// Apply the format string with the specified number format info
string displayString = string.Format(nfi, "{0:c}", number);

// Ta-da
Console.WriteLine(displayString);