如何在“#,## 0”和“{0:n2}”样式格式字符串表示之间进行转换?

时间:2009-02-20 11:36:18

标签: .net formatting string-formatting

.NET支持两种类型的字符串格式。

我处于现有配置数据具有#,##0样式格式的情况。新功能需要格式化为相同的输出,但此功能所需的API仅接受{0:n2}类型的格式。

有没有人知道在数字类型的这两种表示之间进行转换的方法? DateTime可以忽略。

编辑我已经了解到:

3 个答案:

答案 0 :(得分:2)

不,你不能。

link to the MSDN articles about standard format字符串中,您会找到:

  

实际负数模式,   数组大小,千分隔符,   和小数分隔符由。指定   当前的NumberFormatInfo对象。

因此,标准格式说明符将根据程序运行的文化而有所不同。

由于您的自定义格式化确切地指定了数字的外观,无论该程序运行的文化如何。它总是看起来一样。

运行程序的文化在编译期间是未知的,它是一个运行时属性。

所以答案是:不,你不能自动映射,因为没有一对一的一致映射。

答案 1 :(得分:0)

HACK ALERT !!!

作为Arjan pointed out in his excellent answer我想要做的事情是不可能在所有语言环境中采用防弹方式(感谢Arjan)。

就我的目的而言,我知道我只处理数字,而我所关注的主要问题是具有相同的小数位数。所以这是我的黑客。

private static string ConvertCustomToStandardFormat(string customFormatString)
{
    if (customFormatString == null || customFormatString.Trim().Length == 0)
        return null;

    // Percentages do not need decimal places
    if (customFormatString.EndsWith("%"))
        return "{0:P0}";

    int decimalPlaces = 0;

    int dpIndex = customFormatString.LastIndexOf('.');
    if (dpIndex != -1)
    {
        for (int i = dpIndex; i < customFormatString.Length; i++)
        {
            if (customFormatString[i] == '#' || customFormatString[i] == '0')
                decimalPlaces++;
        }
    }

    // Use system formatting for numbers, but stipulate the number of decimal places
    return "{0:n" + decimalPlaces + "}";
}

答案 2 :(得分:0)

用于将数字格式化为2位小数

string s = string.Format("{0:N2}%", x);