在 VB.Net 中使用 {0:C} 格式化零货币值

Format zero currency value with {0:C} in VB.Net

我正在尝试将零货币值格式化为空字符串,以便当货币值为 0.00 时显示空字符串而不是 [=14=].00。 此代码是 ASP.Net 应用程序的一部分,该应用程序将向最终用户显示货币价值。

我使用了以下代码来实现这个目标。

问题 : 是否可以通过仅使用 {0:C} 格式字符串或此格式字符串的另一个版本而不是使用 if then else 编码来实现此目的这个?如果我使用 ###,###,###.## 作为数据格式字符串,则零货币值会显示一个空字符串,而且我会去掉 if then else 编码,但对于非零值,则不会显示货币符号。

If Double.Parse(Decimal.Parse(CDec(currencyValue))) = 0 Then
    charValue = Nothing
Else
    charValue = String.Format("{0:C}", CDec(currencyValue))
End If

更新

我最终使用了以下代码,它运行良好。 If 优于 IIf 因为它会短路,这意味着 IIf 将评估所有表达式,无论条件为真还是假,但 If 将评估第一个表达式仅当条件为真时才计算第二个表达式,仅当条件为假时才计算第二个表达式。

Dim d As Decimal
Decimal.TryParse(currencyValue, d)
charValue = If(d = 0D, Nothing, String.Format("{0:C}", d))

我不认为你可以使用 C 或其他类似的标准格式,因为它们已经定义了一种特定于文化的格式,其中将包括零格式。

但如果您指定自己的自定义格式,则可以指定三种不同的格式,以 ; 分隔,正数、负数和零各一种。

例如(给零格式一个空字符串,导致空白零):

charValue = String.Format("{0:#,##0.00;-#,##0.00;""""}", CDec(currencyValue))

据我所知,省略负数的格式会给出与正数匹配的默认值,而省略零的格式会给出空白,这正是您要查找的内容,所以这也应该足够了:

charValue = String.Format("{0:#,##0.00;;}", CDec(currencyValue))

(使用您想要的任何自定义格式。)

更新:您可以获取当前货币符号并手动将其放入您的自定义格式。即:

Dim symbol = CultureInfo.CurrentCulture.NumberFormat.CurrencySymbol
charValue = String.Format("{0}{1:#,##0.00;;}", symbol, CDec(currencyValue))

虽然听起来,我认为我实际上会建议基本上按照您开始的方式进行操作,也许使用扩展方法。

<Extension>
Public Function ToCurrencyString(pValue As Decimal) As String
   Return IIf(pValue = 0, "", pValue.ToString("C"))
End Function

Dim someValue As Decimal = 1.23
Console.WriteLine(someValue.ToCurrencyString())

这正是您要查找的内容。与 C 给出的格式完全相同,但带有空白零。

我认为没有办法使用格式化来显示空字符串。 但是你可以这样写:

charValue = If( currencyValue = 0D, "", currencyValue.ToString("C") )

使用 If Operator (Visual Basic).

还有这个我不会做的:

If Double.Parse(Decimal.Parse(CDec(currencyValue))) = 0 Then

如果currencyValueDecimal:

If (currencyValue = 0D) Then

如果currencyValueDouble:

If (currencyValue = 0R) Then

此外,如果您正在使用数据库并且这是 Sql 服务器思维 SQL Server Data Type Mappings