列表框中带小数美分的货币

时间:2016-06-17 04:22:37

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

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

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

  1. RecNo(主键的自动编号)
  2. VendorNo - 供应商表的外键 - 该行代表供应商的价格。
  3. PartNo - 零件表的外键 - 该行代表零件的供应商价格。
  4. 数量 - 至少为了获得价格而必须订购的零件数量
  5. 价格 - 商品的价格为5位小数美元。
  6. LastChangedDate - 实际上此行更改的时间戳。
  7. 程序的零件目录功能首先打开所有零件的查找屏幕。用户确定所需的部件和供应商并选择它。那是显示给我带来麻烦的表格的时候。它与零件数据绑定,并有一个列表框,在列表框中显示数量折扣的价格。我从供应商的网站上获取数据并将其添加到PriceLists表中。每添加一行,它就会显示在列表框中。 价格在PriceLists表中定义为货币,带有5位小数。

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

    由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

要获得控制权,请在源中进行格式化,然后更改

Select ProductId, Price, Description From Table

为:

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

但是,当您将值存储为货币时,您将永远不会使用Baker的舍入舍入四位小数:

Value = CCur(0.567892)
' will return: 0.5679

所以可能需要缩放存储的值 - 保存为Cent(x 100)并在读取时除以100:

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

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

另外,如果你非常需要舍入,你可以在这里使用一组功能,这些功能永远不会与浏览时发现的许多快速脏代码相反:

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

作者评论

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

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

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"