【问题标题】:Format a decimal with currency symbol and no trailing zeroes?用货币符号格式化小数并且没有尾随零?
【发布时间】:2014-07-01 12:27:29
【问题描述】:

当前文化是“fr-FR”(已在应用程序中设置)

decimal amount = 20m;

var formattedCurrency = string.Format(Thread.CurrentThread.CurrentCulture, "{0:C}", amount);

它给了我20,00 €

如何去除尾随零?

  1. 注意:如果金额是 20.01,那么输出应该是 20,01 €
  2. 如果金额为 20.00,则输出应为 20 欧元

编辑:

我尝试使用G29 删除尾随零,但丢失了货币符号。 :(

【问题讨论】:

  • @DanielCook 但20.01 将是20 而不是20.01
  • @DanielCook:是的,它把它四舍五入了。我不希望数字被四舍五入,但只想从中删除尾随零。
  • 不,{0:C0} 不起作用dotnetfiddle.net/F3cJmu
  • 你想要 20.1 € 20.1 吗?
  • @DanielCook:是的。确切地。没有四舍五入,但保留货币符号。

标签: c# asp.net .net cultureinfo asp.net-4.5


【解决方案1】:

这将起作用:

string.Format(Thread.CurrentThread.CurrentCulture, "{0:#.##}", amount) + " " + Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencySymbol

如果您需要知道货币符号应该出现在哪里,它会变得有点复杂,但这可能就足够了(取决于您的情况)。

问题是,您不能为货币格式指定条件数字,而且有充分的理由不应该这样做!

问题是:2020.00 丢失有效数字,因此客户不知道它是向下舍入的20.01 还是向下舍入的20.00。我会使用{0:C},除非我有充分的理由不这样做。

【讨论】:

  • 好答案。但是,根据文化,货币符号可以放在金额值之前或之后。例如。 $20 for US 但同样是 €20 in FR
  • 正是我对我的回答的评论打算
  • 您可以使用msdn.microsoft.com/en-us/library/… 放置货币符号,但我想保持简单。
【解决方案2】:
double dec = 20.01;

string amount = string.Format("{0:#.##}", dec);
switch (CultureInfo.CurrentCulture.NumberFormat.CurrencyPositivePattern)
   {
         case 0:
            amount = CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol + amount;
                    break;
         case 1:
            amount = amount + CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol;
                    break;
         case 2:
            amount =  CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol + " " + amount;
                    break;
         case 3:
            amount = amount + " " + CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol;
                    break;
}

Davio 发表评论后更新

问候。

【讨论】:

  • 请完整阅读我的问题。我想将小数打印到带有货币符号但没有尾随零的字符串
  • 愚蠢的问题,但你会一直使用相同的货币吗?
  • @Aymeric 点实际上是“本地化十进制分隔符”;如果您的语言环境使用 , 因为它是小数分隔符,“。”将打印出来。
  • 负值怎么样?也有一种货币模式!主要问题是:看看这段代码变得多么丑陋,当你想模仿一个简单的{0:C} 所做的一切,只是因为你不想砍掉一些零。
  • 肯定会比{0:C}复杂化。关于 NegativePattern 你可以用同样的方式处理它
【解决方案3】:

试试这个https://dotnetfiddle.net/F3cJmu

using System;
using System.Globalization;

public class Program
{
public static void Main()
{
    double amount = 39.5555;

    string decimalPoint = (amount).ToString();

    decimalPoint = decimalPoint.Substring(decimalPoint.IndexOf(".") + 1);

    if( decimalPoint.Length > 0)
        Console.WriteLine(string.Format(new CultureInfo("en-US"),"{0:C" + decimalPoint.Length +"}", amount));
    else
        Console.WriteLine(string.Format(new CultureInfo("en-US"),"{0:C}", amount));

}
}

【讨论】:

  • 但是,如果金额是39.00,它会产生30.0 €。它应该只是30 €
  • 嘿,看看我更新的解决方案。该解决方案解决了货币符号放置问题
  • 看起来不错。谢谢你:)
猜你喜欢
  • 2011-06-27
  • 2012-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多