代码之家  ›  专栏  ›  技术社区  ›  Drew Noakes

如何在“、0”和“0:n2”样式格式字符串表示形式之间转换?

  •  0
  • Drew Noakes  · 技术社区  · 15 年前

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

    我处于现有配置数据 #,##0 样式格式。新功能要求对同一输出进行格式化,但此功能所需的API只接受类型的格式化。 {0:n2} .

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

    编辑 我学到了:

    3 回复  |  直到 8 年前
        1
  •  2
  •   Arjan Einbu    15 年前

    不,你不能。

    从你 link to the MSDN articles about standard format 字符串,你会发现:

    实际的负数模式, 数字组大小,千位分隔符, 小数点分隔符由 当前的NumberFormatInfo对象。

    因此,标准格式说明符将根据运行程序所处的区域性而变化。

    由于自定义格式设置指定了数字的确切外观,所以无论程序运行的区域性是什么。一切看起来都一样。

    程序运行所使用的区域性在编译时未知,它是运行时属性。

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

        2
  •  0
  •   Community rcollyer    7 年前

    黑客警报!!!!

    AS Arjan pointed out in his excellent answer 我想做的是不可能在所有的地方以防弹的方式(谢谢阿扬)。

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

    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 + "}";
    }
    
        3
  •  0
  •   Apps Tawale    8 年前

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

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