【问题标题】:Format a double value like currency but without the currency sign (C#)格式化像货币一样但没有货币符号的双精度值(C#)
【发布时间】:2010-11-06 03:01:27
【问题描述】:

我给一个文本框输入了一个字符串值,显示了一个需要像这样格式化的余额:

###,###,###,##0.00

我可以使用 value.ToString("c"),但这会将货币符号放在它前面。

知道在输入文本框之前如何操作字符串以实现上述格式吗?

我试过了,没有成功:

String.Format("###,###,###,##0.00", currentBalance);

非常感谢,

【问题讨论】:

    标签: c# string format currency


    【解决方案1】:

    如果货币格式完全符合您的要求,请克隆NumberFormatInfo 并将CurrencySymbol 属性设置为“”。当然,您应该检查它是否也以您想要的方式处理负数。

    例如:

    using System;
    using System.Globalization;
    
    class Test
    {
        static void Main()
        {
            NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
            nfi = (NumberFormatInfo) nfi.Clone();
    
            Console.WriteLine(string.Format(nfi, "{0:c}", 123.45m));
            nfi.CurrencySymbol = "";
            Console.WriteLine(string.Format(nfi, "{0:c}", 123.45m));
        }
    }
    

    当然,另一种选择是使用自定义数字格式字符串 - 这取决于您是否真的想准确地反映货币的外观,只是没有符号,或者控制数字的确切位置。

    【讨论】:

    • 这非常有效。如果您希望将货币格式化为当前文化但没有符号,这似乎是最好的解决方案。
    • 您可以考虑在结果中添加 Trim() 以确保没有前导(或尾随)空格。
    • @BenjaminWegman:我认为如果文化敏感货币格式包含空格,那么它的存在是有充分理由的。
    • 我认为这种设置 CurrencySymbol = "" 的技术不太正确。如果 CurrencyNegativePattern 为 8、11、12、13、14 或 15,则输出中有一个额外的空间。我认为这是@BenjaminWegman 关于修剪空间的想法,但例如 CurrencyNegativePattern 14 with CurrencySymbol == "$" 将给出 "($ 1,234.56) 而 CurrencySymbol == "" 将给出 "( 1,234.56)" 当 "(1,234.56 )" 可能是需要的。
    【解决方案2】:
    string forDisplay = currentBalance.ToString("N2");
    

    【讨论】:

    • 这是不可接受的,因为如果文化中货币的负号是 () 而小数的负号是 -,货币表示将不正确。
    • @Bob:这是公认的答案,因此根据定义,它是 OP 可以接受的。由于“格式类似于货币但没有货币符号”没有内置格式说明符,因此在这种情况下需要进行某种手动处理:(1) 使用自定义 NumberFormatInfo 作为根据 Jon 的回答,(2) 使用自定义格式字符串,或 (3​​) 调用 ToString("c"),然后进行后处理以删除符号。
    • @LukeH:虽然这是公认的答案,但 Jon Skeet 给出的答案更正确,因为它使用了 NumberFormatInfo 提供的货币格式。
    • @D.帕特里克:为什么?当接受的答案完全错误或具有误导性时,我也感到沮丧,但在这种情况下,我正确回答了所提出的问题,大概这就是 OP 选择此作为他们接受的答案的原因。 (诚​​然,问题标题与问题正文中提出的问题之间存在差异,但如果这对您来说是个问题,那么也许您可以向 OP 提出问题。)
    • @LukeH,Bob 提出了一个很好的观点,我不觉得问题主体是“你如何格式化带有 2 个小数点和逗号的数字”。我以为你忽略了他的关心。但是,这只是部分原因。 “这是公认的答案,所以根据定义,它是 OP 可以接受的”似乎很刻薄,我觉得它对社区没有多大帮助。事实上,如果他/她知道这些缺点,那么 OP 很可能不会接受您的回答,而 IMO 的 Bob 只是试图指出这一点。
    【解决方案3】:

    你试过了吗:

    currentBalance.ToString("#,##0.00");
    

    这是长期等价的:

    currentBalance.ToString("N2");
    

    【讨论】:

      【解决方案4】:

      string result=string.Format("{0:N2}", value); //对于像### ### ##.##这样的结果

      【讨论】:

        【解决方案5】:

        您可以使用the group separatorthe section separator 执行此操作,如下所示:

        currentBalance.ToString("#,0.00;(#,0.00)");
        

        这并没有像@JonSkeet 的回答那样考虑文化差异,但这确实模仿了使用单个自定义格式字符串产生的 en-US 文化货币格式产生的小数位、四舍五入、千位分隔和负数处理。

        .NET Fiddle Demo

        【讨论】:

          【解决方案6】:
          CultureInfo cultureInfo = new CultureInfo("en-US");
          cultureInfo.NumberFormat.CurrencySymbol = "Rs.";
          
          Thread.CurrentThread.CurrentCulture = cultureInfo;
          decimal devimalValue = 3.45M;
          this.Text = devimalValue.ToString("C2"); //Rs.3.45
          

          【讨论】:

            【解决方案7】:
            var result = currentBalance.ToString("C").Replace(System.Globalization.CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol, "");
            

            【讨论】:

            • 虽然这可能会回答问题,但您应该edit 回答您的回答,以简要说明如何 这行代码回答了问题。这有助于提供上下文,并使您的答案对以后遇到相同问题的人更有用。
            【解决方案8】:

            这可能有点矫枉过正,但它会四舍五入、格式化......

            @helper TwoDecimalPlaces(decimal? val)
            {
                decimal x = 0;
                decimal y = 0;
                string clas = "text-danger";
                if (val.HasValue)
                {
                    x = (decimal)val;
                    if (val > 0)
                    {
                        clas = "";
                    }
                }
                y = System.Math.Round(x, 2);
                IFormatProvider formatProvider = new System.Globalization.CultureInfo(string.Empty);
                <span class="@clas">@string.Format("{0:N2}", y)</span>
            }
            

            【讨论】:

              【解决方案9】:

              这个简单的解决方案适用于我的美元货币。

              如果不需要国际货币支持,请使用此选项并将 $ 替换为要删除的货币符号:

              // for USD
              string result = currentBalance.ToString("C").Replace("$", "")
              

              // for EUR
              string result = currentBalance.ToString("C").Replace("€", "")
              

              【讨论】:

                猜你喜欢
                • 2012-01-29
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-01-22
                • 1970-01-01
                • 2018-03-29
                • 1970-01-01
                相关资源
                最近更新 更多