格式双倍百分比 - 显示所有小数?

时间:2013-12-16 10:35:35

标签: c# string format

我找不到一种方法来将double格式化为显示C#4.0中所有小数的百分比。

使用{0:P}{0:P2}具有相同的效果,即格式化为百分比,严格显示两位小数。

我终于用{0:P}替换了有问题的{0:0.################################%}。为了我的目的,我的双打不会达到那么多的小数。

5 个答案:

答案 0 :(得分:1)

“P”格式说明符使用当前的文化信息,您可以使用NumberFormatInfoPercentDecimalDigits获取小数点后的默认位数。

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 %

使用P14NumberFormatInfo.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);