【问题标题】:Int.ToString("C") removes negative symbolInt.ToString("C") 删除负号
【发布时间】:2012-12-17 17:42:33
【问题描述】:

根据http://msdn.microsoft.com/en-us/library/6t7dwaa5.aspx,如果我想将数字显示为货币,我可以调用 .ToString() 并传递一个参数,在本例中为“C”

但是,根据下面来自 MSDN 站点的详细信息,它会自动删除减号 (-) 字符,这意味着我的值现在是正数。

int value = -16325;   
// Display value using default ToString method.
Console.WriteLine(value.ToString());            // Displays -16325 
// Display value using some standard format specifiers.
Console.WriteLine(value.ToString("G"));         // Displays -16325
Console.WriteLine(value.ToString("C"));         // Displays ($16,325.00)
Console.WriteLine(value.ToString("D"));         // Displays -16325
Console.WriteLine(value.ToString("F"));         // Displays -16325.00
Console.WriteLine(value.ToString("N"));         // Displays -16,325.00
Console.WriteLine(value.ToString("X"));         // Displays FFFFC03B 

那么,如何使用减号保留它,我是否必须使用 Contains("-") 方法,如果它是真的添加 - 回来。

类似这样的代码(如果代码不正确,我们深表歉意,但你明白了)。

string x = (value.ToString().Contains("-") : "-" + value.ToString("C") ?  + value.ToString("C"));

【问题讨论】:

  • 如果您将“-”替换为 MSDN 所说的“(...)”,这是正确的,并且取决于 Windows 控制面板中用户的区域设置,如果用户想要查看(而不是减号,为什么要覆盖他/她的设置?
  • 方括号表示应用当前文化中的负面因素
  • @DavidePiras - 好问题,在这种情况下,必须在远程服务器上设置软件,该服务器必须在我们的“主要”软件运行的区域设置中,我的应用程序只是一个除此之外;虽然每个人都会说英语,但对于帐户,它必须显示 - 或不显示!
  • @DaveRook 您可以随时将特定文化传递给ToString...

标签: .net tostring


【解决方案1】:

这取决于机器的本地化设置。许多语言环境中的负货币表示为( amount ) 所以.net 在这里使用它。我不确定如何覆盖它。但这就是这里发生的事情。

【讨论】:

    【解决方案2】:

    这取决于文化。它使用NumberFormatInfo.CurrencyNegativePattern - 在美国似乎使用括号来表示负数。 (正数没有括号。)

    所以您可以克隆您当前的CultureInfo,并更改相关NumberFormatInfoCurrencyNegativePattern - 但我会谨慎这样做。通常,您应该相信 .NET 使用的文化信息适合该文化。当然,您需要确定是否想要特定于文化的表示 - 如果不是,您可能想要使用不变的文化。

    【讨论】:

    • 我同意更改它可能会产生负面影响,但是,在我的情况下,它是一个非常小的报告,仅显示我们的目标利润高于或低于!再次感谢您!
    【解决方案3】:

    你可以用这个:

    string text = value < 0 ? "-" + (-value).ToString("C") : value.ToString("C");
    

    但请确保本地化设置不会更改以防止出现不可预测的结果(例如 --$ 1.00)

    【讨论】:

    • 现在你有-(123.45)
    【解决方案4】:

    你可以试试这个

            Console.WriteLine((-1234).ToString("c"));
            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
            CultureInfo newCulture = new CultureInfo(currentCulture.IetfLanguageTag);
            newCulture.NumberFormat.CurrencyNegativePattern = 1;
            Thread.CurrentThread.CurrentCulture = newCulture;
            Console.WriteLine((-1234).ToString("c"));
    

    MSDN : NumberFormatInfo.CurrencyNegativePattern Property 了解详情...

    【讨论】:

      【解决方案5】:

      您可以从您当前的语言环境创建自定义NumberFormatInfo。然后可以指定为CurrencyNegativePattern,例如:

      int value = -16325;
      var culture = CultureInfo.CurrentCulture;
      var mutableNfi = (NumberFormatInfo)culture.NumberFormat.Clone();
      mutableNfi.CurrencyNegativePattern = 1;
      Console.WriteLine(value.ToString("C", mutableNfi)); // Displays (-$16,325.00)
      

      【讨论】:

        【解决方案6】:

        可以使用该方法获取货币字符串,只有在括号中,去掉括号并添加一个“-”。

        private string ToCurrencyString(decimal amount)
        {
            string c = amount.ToString("C");
            if (c.StartsWith("(") && c.EndsWith(")"))
            {
                c = "-" + c.SubString(1, c.Length - 2);
            }
            return c;
        }
        

        【讨论】:

        • 这不是改变这一点的方法。 .NET Framework 中的格式取决于特定的文化。
        • @WouterdeKort 你能解释一下为什么你认为它不起作用吗? OP 知道文化依赖性,但明确希望删除括号并添加“-”,那么它怎么不是解决方案?
        • 因为有更优雅的解决方案。如果将文化更改为不使用 ( ) 而是使用 [ ] 的文化,那么您的代码会突然中断,而 Tim Schmelter 的解决方案始终有效。
        • @WouterdeKort 我同意基本推理,但没有文化使用 [ ] 或除 ( ) 以外的任何其他括号。我知道这是一个 hack,并且另一个解决方案更正确,但我不认为这是一个错误的解决方案。
        【解决方案7】:

        这取决于您的CurrentCulture.NumberFormat.CurrencyNegativePattern 的值。可能的值是 0 - 15:

        0 : ($12,345.00)
        1 : -$12,345.00
        2 : $-12,345.00
        3 : $12,345.00-
        4 : (12,345.00$)
        5 : -12,345.00$
        6 : 12,345.00-$
        7 : 12,345.00$-
        8 : -12,345.00 $
        9 : -$ 12,345.00
        10 : 12,345.00 $-
        11 : $ 12,345.00-
        12 : $ -12,345.00
        13 : 12,345.00- $
        14 : ($ 12,345.00)
        15 : (12,345.00 $)
        

        因此,您似乎想将其设置为 1 以获得您所追求的输出,例如:

        int value = -12345;
        
        var numberFormat = (NumberFormatInfo)CultureInfo.CurrentCulture.NumberFormat.Clone();
        numberFormat.CurrencyNegativePattern = 1;
        
        string numberAsCurrency = value.ToString("C", numberFormat)
        

        不过,基于您的 cmets 认为它​​是一个远程服务器,并且您总是希望以特定方式进行格式化,最好将整个线程的区域性设置为受控值,这将影响所有后续 @987654325 @ 调用该线程:

        int value = -12345;
        Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-US");
        Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyNegativePattern = 1;
        string numberAsCurrency = value.ToString("C");
        

        【讨论】:

          猜你喜欢
          • 2021-04-13
          • 1970-01-01
          • 2021-05-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多