【问题标题】:Format a number that can be variably rounded with thousand separator格式化一个可以用千位分隔符可变四舍五入的数字
【发布时间】:2018-12-24 06:10:41
【问题描述】:

我有一个以变量“dTot”结尾的代码,它是一个小数点后最多 5 位的数字。

用户可以选择设置舍入 dTot 的小数位数,用户选择被分配给变量“iDP”,它可以是 0 到 5 之间的任何值。

dTot = Round(dTot, iDP)` 工作正常。

但是,当添加到另一个数组时,我还需要用千位分隔符格式化舍入数字。

Format(Round(dTot, iDP), "#,##0.00000")

如果 iDP 为 5 则有效,并且

Format(Round(dTot, iDP), "#,##0.00")

如果 iDP 为 2

我怎样才能获得遵循 iDP 值的格式?

我知道我可以使用“Select Case iDP”并有 6 个案例,但由于需要将格式设置应用于数组中 200 行中的每一个中的最多 6 个表达式,我希望找到一种方法来避免“Select Case "

【问题讨论】:

  • 好的,我用函数解决了它。将 Select Case 放入以 iDP 作为参数的公共函数中。在主代码中使用sFmt = FmatStr(iDP) 然后用于格式化Format(Round(dTot, iDP), sFmt)
  • 让我们看看函数。
  • Public Function FmatStr(i As Integer) As String Select Case i Case Is = 0: FmatStr = "#,##0" Case Is = 1: FmatStr = "#,##0.0" Case Is = 2: FmatStr = "#,##0.00" Case Is = 3: FmatStr = "#,##0.000" Case Is = 4: FmatStr = "#,##0.0000" Case Is = 5: FmatStr = "#,##0.00000" Case Is = 6: FmatStr = "#,##0.000000" End Select End Function
  • user10825204 的公式要短得多,包含更多小数。

标签: excel vba


【解决方案1】:

根据需要构建格式掩码字符串。

Format(Round(dTot, iDP), "#,##0" & IIF(iDP, ".", "") & string(iDP, "0"))

【讨论】:

  • 顺便说一句,Round 函数可能是多余的,因为格式掩码将结果“四舍五入”为显示的指定小数。
  • 谢谢,user10825204,但使用您的公式,iDP 为 3,dTot 为 1569231622.7464,它返回 0,而我的函数返回 1,569,231,622.746,这是正确的。
  • 我原来在IIF(iDP, ".", "") 中将, 打错了.。我在发布回复后几分钟内就解决了,但我猜你错过了更正。
  • OOOps 我的错,我在这里使用 dTot 作为示例,但在我的实际代码中,我有 dTot1 到 dTot6,我将您的公式直接复制到我的代码中并且没有更改 dTot。一看到公式,我就想“那行得通”。感谢您的回复!
【解决方案2】:

编辑:在user10825204 接受的答案中添加了出色的“& IIF(iDP, ".", "")”:

WorksheetFunction.Rept 与替换(空格)

WorksheetFunction.Rept

Format(Round(dTot, iDp), "#,##0" _
    & IIF(iDP, ".", "") & WorksheetFunction.Rept("0", iDp))

替换(空格)

Format(Round(dTot, iDp), "#,##0" _
    & IIF(iDP, ".", "") & Replace(Space(iDp), " ", "0"))

【讨论】:

  • 对于我在上面对 user10825204 的回答的评论中显示的值,这两个值都返回 0。
  • 查看我上面的评论,当我更改 dTot 时,您的公式也有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2020-03-15
  • 1970-01-01
  • 2013-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多