【问题标题】:Format decimal value to currency with 2 decimal places [duplicate]将十进制值格式化为具有 2 个小数位的货币 [重复]
【发布时间】:2014-02-23 05:28:57
【问题描述】:

我从 csv 文件中获取数据并将其解析到我的应用程序。在我的 csv 文件中,我有一个列 price,我当然将其值用作我项目中某个项目的价格。

但是,csv 文件中的价格不包含尾随 0, 例如,如果商品的价格为$5.00,则csv 文件中的名称为$5,如果价格为$9.60,则csv 文件中的名称为$9.6。不过$9.56 等其他价格也不错。

这是我从 csv 文件中检索价格的方式:

 Price = string.IsNullOrEmpty(columns[3].Trim()) ?
     null : (decimal?)decimal.Parse(columns[3]), 

在我的班级中,Price 设置为 public decimal? Price { get; set; }

如何格式化返回的内容以解决此问题?

Price = String.Format("Price: {0:C}", 
     string.IsNullOrEmpty(columns[3].Trim()) ? 
        null : (decimal?)decimal.Parse(columns[3]));

我尝试了上述方法,但没有成功。

如何修复它,以便将 csv 中的值作为 $5.9 格式化为 $5.90

编辑:

试过了:

Price=decimal.Round(string.IsNullOrEmpty(columns[3].Trim()) ? 
    null : 
    (decimal?)decimal.Parse(columns[3]), 2, MidpointRounding.AwayFromZero);

不确定我这样做是否正确?

另外,我不确定如何在我的代码中使用以下选项:

decimalVar.ToString ("#.##");

也试过了:

 Price = string.IsNullOrEmpty(columns[3].Trim()) ? 
      null : (decimal?)decimal.Parse(columns[3], NumberStyles.Currency)

但还是不行。

【问题讨论】:

  • 货币请使用decimal,而不是double。见What is the best data type to use for money in c#?
  • @Romoku 更改为十进制类型,但没有任何变化,仍然有问题
  • @AlexeiLevenkov 请看上面的编辑,试过但没用
  • 我已经添加了货币的答案(也更新了链接的帖子)。
  • Price 属性是什么数据类型?您的代码示例冲突,一些是Strings,而另一些是Decimal?

标签: c# string-formatting


【解决方案1】:

您正在寻找"0:C2" 请参阅Standard Numeric Format Strings

精度说明符:小数位数

示例:

 String.Format("{0:C2}", 5d); //results in $5.00
 String.Format("{0:C2}", 5.9d); //results in $5.90
 String.Format("{0:C2}", 5.123d); //results in $5.12

【讨论】:

  • 好的,但是价格在我的班级中设置为十进制类型。此外,我无法为每个指定值,它已从我的 csv 的列 [3] 中退出。
  • 这个答案很好。您仍然将数字的事实与文本显示混淆。
  • 我不明白为什么当我的答案达到相同的结果时这个答案有一个赞成票,同时还解释了所需的解析。只是有点迷茫……
  • 好的,那么这是否是正确的方法Price = string.IsNullOrEmpty(columns[3].Trim()) ? null : (decimal?)decimal.Parse(String.Format("{0:C2}", columns[3]d)), 不确定如何将您的答案与我的问题代码结合起来
  • @user3237078 - 不幸的是你的代码很难阅读/修改,所以你必须自己做 - 对不起。如果您停止尝试在单个语句中执行所有代码,它将使编写代码更容易。创建将解析数据与格式化分开的局部变量没有额外成本 - 因此为每个步骤制作单独的变量:从 CSV 读取字符串,转换为十进制,在需要时格式化为字符串。
【解决方案2】:

此答案将假设您的本地货币符号为$

使用Decimal.Parse(String, NumberStyles)解析字符串,即:

string priceFromCsv = "$5";
var priceAsDecimal = Decimal.Parse(priceFromCsv, NumberStyles.Currency);

然后使用格式为“C”的Decimal.ToString(String) 回到完全形成的货币,即

priceAsDecimal.ToString("C");

这将为您提供具有正确小数位数的完整货币。

【讨论】:

  • 当我尝试这个 ` Price = string.IsNullOrEmpty(columns[3].Trim()) ? null : (double?)Decimal.Parse(columns[3], NumberStyles.Currency),` 我收到错误“当前上下文中不存在名称“NumberStyles””
  • 没关系,只需通过添加参考来修复该错误
  • 还是不行。我一直在尝试将其与 string.IsNullOrEmpty(columns[3].Trim()) ? null : (decimal?)decimal.Parse(columns[3]) 集成,但我不能;无法让它发挥作用
  • 您希望将空字符串格式化为“$0.00”还是生成空的string
  • 我不明白为什么当我的答案达到相同的结果时这个答案有一个赞成票,同时还解释了所需的解析...我不明白为什么人们不先搜索就一直问同样的问题……这就是这个地方有时的运作方式。 ;)
【解决方案3】:

decimals 没有“格式”——它们只是一个数字。看起来您正在尝试将格式“分配”到您无法执行的 Price 列。根据您的第一个代码示例,您似乎能够将 CSV 输入解析为小数。

当您显示该值时,您可以选择格式,您没有指出发生的位置。在应用程序中?一份报告?另一个 CSV?

【讨论】:

  • 我在 Web 服务中从 csv 获取数据,上面的代码用于我的 Web 服务中。 Web 服务中的这些数据用于 Windows 8 应用程序。它以小数形式返回,我要做的只是修正四舍五入,这样 5.9 美元的值将在我的网络服务中被格式化为 5.90 美元
  • 您在在应用中显示值时这样做,而不是在导入数据时这样做。
  • 所以这不能在web服务上完成?但我已经格式化了要在我的应用程序中使用的其他 csv 项目
  • 如果类型是 string 而不是 decimal 则可以。我仍然认为 formatting 属于 UI 层,而不是服务层。
  • 我实际上在应用层中使用了格式并且效果很好,虽然不是我想要的,但它确实有效。我想投票赞成你的答案,但我没有足够的代表。
猜你喜欢
  • 2017-08-15
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-29
相关资源
最近更新 更多