0

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

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

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

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

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

谢谢

4

2 回答 2

1

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

要控制,请在源代码中进行格式化,从而更改

Select ProductId, Price, Description From Table

至:

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

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

Value = CCur(0.567892)
' will return: 0.5679

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

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

或者您可以使用 Double 作为数据类型进行保存。但是请注意,由于可能存在位错误,因此通常不应将 Double 用于任何货币计算。

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

将值向上、向下、4/5 或有效数字四舍五入

作者评论

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

以下是新工作代码的代码片段:

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"
于 2016-06-17T08:11:21.440 回答
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的方法签名

格式货币

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

格式编号

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
于 2016-06-17T05:36:54.177 回答