【问题标题】:Currency with fractional cents in a list box列表框中带有小数美分的货币
【发布时间】:2016-06-17 04:22:37
【问题描述】:

我正在构建一个购物计划 - msAccesss 2016。如果购买了至少 10 个,一些要购买的物品是价格为 0.06100 美元的电子元件。 我试图在列表框中显示数量和单价。列表框将价格四舍五入为美分。有人知道在列表框中显示整个 $0.06100 的方法吗?它在表的数据表视图和绑定到列表框的查询的数据表视图中显示 OK。

更多细节: Shopper 中包含此信息的部分是一个名为 PriceLists 的表。它有:

  1. RecNo(主键自动编号)
  2. VendorNo - 供应商表的外键 - 该行代表供应商的价格。
  3. PartNo - 零件表的外键 - 该行代表供应商的零件价格。
  4. 数量 - 至少必须订购的零件数量才能获得价格
  5. 价格 - 商品的价格精确到小数点后 5 位美元。
  6. LastChangedDate - 实际上是该行最后一次更改的时间戳。

程序的零件目录功能首先显示所有零件的查找屏幕。用户确定所需的部件和供应商并选择它。那就是显示给我带来麻烦的表格的时候。它与零件数据绑定,并有一个列表框,在列表框中显示价格和数量折扣。我从供应商的网站获取数据并将其添加到 PriceLists 表中。随着每一行的添加,它会显示在列表框中。 价格在 PriceLists 表中定义为货币,保留 5 位小数。

我在互联网上的任何地方都找不到有关此问题的任何讨论。所以我是唯一的一个,或者这很容易,我错过了一些简单的东西。我正在使用 vba 来驱动表单并设置列表框和其他控件,因此我正在寻找 vba 解决方案。

谢谢

【问题讨论】:

    标签: vba listbox ms-access-2013 ms-access-2016


    【解决方案1】:

    使用 FormatCurrency([Expression], [Number Of Digits]) 或 FormatNumber([Expression], [Number Of Digits])。两者都将 [Expression] 舍入为 [Number Of Digits] 作为字符串

    FormatCurrency([0.06100], 5) 返回“$0.06100”

    FormatNumber([0.06100], 5) 返回“$0.06100”

    这里有取自 MSDN

    的方法签名

    FormatCurrency

    Function FormatCurrency(
       ByVal Expression As Object,
       Optional ByVal NumDigitsAfterDecimal As Integer = -1,
       Optional ByVal IncludeLeadingDigit As TriState = TriState.UseDefault,
       Optional ByVal UseParensForNegativeNumbers As TriState = TriState.UseDefault,
       Optional ByVal GroupDigits As TriState = TriState.UseDefault
    ) As String
    

    FormatNumber

    Function FormatNumber(
       ByVal Expression As Object,
       Optional ByVal NumDigitsAfterDecimal As Integer = -1,
       Optional ByVal IncludeLeadingDigit As TriState = TriState.UseDefault,
       Optional ByVal UseParensForNegativeNumbers As TriState = TriState.UseDefault,
       Optional ByVal GroupDigits As TriState = TriState.UseDefault
    ) As String
    

    【讨论】:

      【解决方案2】:

      “问题”是列表框仅显示文本,因此任何数字源字段都使用 Windows 设置中的默认格式转换为文本。

      要获得控制权,请在源代码中进行格式化,从而改变

      Select ProductId, Price, Description From Table
      

      到:

      Select ProductId, Format(Price, "$0.000000"), Description From Table
      

      但是,当您将值存储为货币时,使用贝克四舍五入法四舍五入的小数点永远不会超过四位:

      Value = CCur(0.567892)
      ' will return: 0.5679
      

      因此可能必须缩放存储的值 - 保存为美分 (x 100) 并在读取时除以 100:

      Select ProductId, Format(PriceCent / 100, "$0.000000"), Description From Table
      

      或者您可以使用 Double 作为数据类型进行保存。但是请注意,由于可能出现位错误,一般情况下您不应该使用 Double 进行任何货币计算。

      另外,如果您非常需要舍入,您可以使用此处的一组函数,与浏览时发现的许多快速-n-脏代码片段相反,这些函数永远不会失败:

      Rounding values up, down, by 4/5, or to significant figures

      作者评论

      将“价格”字段更改为“双数”而不是“货币”可以让我在单价上获得小数点后 5 位的精度,而无需进行缩放。我尝试使用 Access SQL 文档中的 DECIMAL,但代码中似乎没有。所以我选择了Double。我只需要在定价购物清单的计算中将其四舍五入到 5 位精度。当我必须进行计算时,这似乎比缩放更容易。

      下面是新工作代码的代码sn-p:

      Const strPriceFormat As String = """$##0.00###"""
      Const sqlVendorPriceList As String = "SELECT PricesLists.RecNo" & _
                                      ", PricesLists.VendorNo AS VNo" & _
                                      ", PricesLists.PartNo as Pno" & _
                                      ", PricesLists.Quantity as Qty" & _
                                      ", Format(PricesLists.Price, " & strPriceFormat & ") as Price" & _
                                      " FROM PricesLists INNER JOIN VendorParts" & _
                                      " ON PricesLists.PartNo=VendorParts.PartNo" & _
                                      " AND PricesLists.VendorNo = VendorParts.VendorNo"
      

      【讨论】:

      • 好的。在 VBA 中,Decimal 仅可用作 Variant 的子数据类型。如果您想查看其使用示例,请研究我上面提供的舍入函数的链接,您会看到大量使用 CDec 来获得函数的高精度和零误差。
      猜你喜欢
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多