我找不到一种方法来将double格式化为显示C#4.0中所有小数的百分比。
使用{0:P}
与{0:P2}
具有相同的效果,即格式化为百分比,严格显示两位小数。
我终于用{0:P}
替换了有问题的{0:0.################################%}
。为了我的目的,我的双打不会达到那么多的小数。
答案 0 :(得分:1)
“P”格式说明符使用当前的文化信息,您可以使用NumberFormatInfo和PercentDecimalDigits获取小数点后的默认位数。
NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
Console.WriteLine(string.Format("{0} PercentDecimalDigits", nfi.PercentDecimalDigits));
您可以使用以下格式扩展此数字:
Console.WriteLine(string.Format("Value: {0:P4}.", 0.123456));
或者自己计算百分比。
答案 1 :(得分:1)
使用CultureInfo.InvariantCulture对我来说很好,所以不,全球化 不是问题
那么,那么:
double myDouble = (double)1 / 3; // 0.3333333...
string asString = string.Format("{0} %", myDouble * 100);
答案 2 :(得分:1)
基本上这就是你想要做的事情:
string.Format("{0:0.############## %}", 0.1234); // 12.34 %
string.Format("{0:0.############## %}", 0.1234567); //12.34567 %
note :对于小数,您将使用0.############################
。
替代方案的缺点
您应该注意到0:0.00000000000000 %
留下尾随零:
string.Format("{0:0.00000000000000 %}", 0.1234); // 12.34000000000000 %
使用P14
或NumberFormatInfo.PercentDecimalDigits
具有相同的行为。如果要截断数字,哪个好。您也可以为部门提供资源,但要注意四舍五入。
如果你想要没有尾随零的完整精确度,你应该使用0.############## %
。
您可以使用此方法构建一个与默认P
形式相匹配的自定义格式,但没有固定数量的小数位:
public string GetPercentFormat(CultureInfo culture)
{
if (culture == null)
{
culture = CultureInfo.CurrentCulture;
}
NumberFormatInfo nfi = culture.NumberFormat;
//% and . are localized by default
var baseFormat = "0.################";
var percentSymbol = "%";
var negativeSign = nfi.NegativeSign; //It may be problematic
string customFormat = string.Empty;
switch (nfi.PercentPositivePattern)
{
case 1: //n%
customFormat += baseFormat + percentSymbol;
break;
case 2: //%n
customFormat += percentSymbol + baseFormat;
break;
case 3: //% n
customFormat += percentSymbol + " " + baseFormat;
break;
case 0: //n %
default:
customFormat += baseFormat + " " + percentSymbol;
break;
}
customFormat += ";";
switch (nfi.PercentNegativePattern)
{
case 1: //-n%
customFormat += negativeSign + baseFormat + percentSymbol;
break;
case 2: //-%n
customFormat += negativeSign + percentSymbol + baseFormat;
break;
case 3: //%-n
customFormat += percentSymbol + negativeSign + baseFormat;
break;
case 4: //%n-
customFormat += percentSymbol + baseFormat + negativeSign;
break;
case 5: //n-%
customFormat += baseFormat + negativeSign + percentSymbol;
break;
case 6: //n%-
customFormat += baseFormat + percentSymbol + negativeSign;
break;
case 7: //-% n
customFormat += negativeSign + percentSymbol + " " + baseFormat;
break;
case 8: //n %-
customFormat += baseFormat + " " + percentSymbol + negativeSign;
break;
case 9: //% n-
customFormat += percentSymbol + " " + baseFormat + negativeSign;
break;
case 10: //% -n
customFormat += percentSymbol + " " + negativeSign + baseFormat;
break;
case 11: //n- %
customFormat += baseFormat + negativeSign + " " + percentSymbol;
break;
case 0: //-n %
default:
customFormat += negativeSign + baseFormat + " " + percentSymbol;
break;
}
return customFormat;
}
注意:使用StringBuilder
实现此功能可能是值得的。
像这样使用:
void Main()
{
var customFormat = GetPercentFormat(null);
Console.WriteLine(string.Format("{0:"+ customFormat + "}", 0.1234));
}
输出:
12.34 %
您还可以使用其他CultureInfo
:
void Main()
{
var culture = new CultureInfo("quz-BO"); //Quechua (Bolivia)
var customFormat = GetPercentFormat(culture);
Console.WriteLine(string.Format(culture, "{0:"+ customFormat + "}", 0.1234));
}
输出:
%12,34
GetPercentFormat
生成的格式几乎完全本地化。它将考虑给定CultureInfo
的自定义否定和正面格式。注意:几乎完全本地化,因为未使用组(NumberFormatInfo.PercentGroupSeparator)和组大小(NumberFormatInfo.PercentGroupSizes)。
答案 3 :(得分:0)
十进制类型的精度约为30位数。所以没有办法“真正”显示无限的十进制数。
但请看一下'#'http://msdn.microsoft.com/en-us/library/0c899ak8.aspx
答案 4 :(得分:0)
{0:P}严格限制在2位小数
如果要使用,则必须硬编码十进制值。
在我看来,其他方式就像这样
double valueToDisplay =(10.0 /7.0); var percentValue = String.Format(“{0}%”,valueToDisplay);