0

我想编写一个函数,它接受一个currencyCode As String输入参数并输出一个自定义的currencyFormatString. 我的困境是决定最好的(正确的)方法来做到这一点。currencyCodeISO 4217货币代码(例如“USD”、“GBP”、“JPY”等),我想执行以下步骤:

  1. 检查空字符串或空字符串。
  2. 将代码转换为相应的货币符号(如上面的“$”、“£”、“¥”)。
  3. 使用适当的符号格式化返回的字符串。

我有两种格式化情况:有美分和没有美分。在日元的情况下,从来没有美分,所以在这种情况下,我总是会返回非美分(不是废话,:P)格式。

我最新的想法是创建一个Dictionary并用我需要的代码和符号填充它(仅供参考,我们目前只需要 6 个代码/符号,这很少改变)。这是一个坏主意吗?有更好的吗?也许是一个 XML 文件?如果可以的话,我会喜欢代码示例。我自己会提供一个,但在这一点上,这是一堆失败/不太理想的尝试。

解决方案——基于数小时的研究、反复试验和@tinstaafl 的意见。

'Method 1: Using Enumerable Type with Character Codes
'  Limitation: Does not support currency symbols with more than one character.
Public Module SLCurrency
    Enum ISOCurrency
        USD = 36
        CAD = 36
        AUD = 36
        EUR = 8364
        GBP = 163
        JPY = 165
    End Enum

    Public Function GetCurrencyFormat(ByVal currencyCode As String, ByVal withCents As Boolean) As String
        Dim _numberFormatString, _currency As New ISOCurrency

        [Enum].TryParse(Of ISOCurrency)(currencyCode, _currency)

        If withCents AndAlso Not _curr.Equals(ISOCurrency.JPY) Then
            _numberFormatString = "{0}* #,##0.00;[Red]{0}* (#,##0.00);{0}* ""-"";@"
        Else
            _numberFormatString = "{0}* #,##0;[Red]{0}* (#,##0);{0}* ""-"";@"
        End If

        Return String.Format(_numberFormatString, ChrW(_currency).ToString.Trim({ChrW(0)}))
    End Function
End Module
'Method 2: Using a Dictionary of Currency Codes (key) and Symbols
'  Advantage: Support currency symbols with more than one character,
'  but is not quite as clean and can be more complex to implement.
Public Module SLCurrency
    Dim CurrencyDict As New Dictionary(Of String, String) From {
        {"USD", "$"}, {"CAD", "$"}, {"AUD", "$"}, {"EUR", "€"}, {"GBP", "£"}, {"JPY", "¥"}
    }

    Public Function GetCurrencyFormat(ByVal currencyCode As String, ByVal withCents As Boolean) As String
        Dim _numberFormatString, _currency As String
        _currency = String.Empty

        CurrencyDict.TryGetValue(currencyCode, _currency)

        If withCents AndAlso Not _currency.Equals("JPY") Then
            _numberFormatString = "{0}* #,##0.00;[Red]{0}* (#,##0.00);{0}* ""-"";@"
        Else
            _numberFormatString = "{0}* #,##0;[Red]{0}* (#,##0);{0}* ""-"";@"
        End If

        Return String.Format(_numberFormatString, _currency)
    End Function
End Module

我总是欢迎对我的解决方案发表评论。它帮助我成为一个更好的程序员。:)

在这一点上,我认为我将使用方法 1 以使代码更简单一些,因为我预计不需要增加复杂性来支持更长的货币符号,特别是因为它们中的大多数都是非常晦涩的货币,企业会无论如何都不太可能接受付款。

4

2 回答 2

1

一种简单的方法是创建一个枚举,其值为符号的字符代码:

Enum CurrencySymbols
    USD = 36
    GBP = 163
    JPY = 165
End Enum

将字符串转换为枚举值并将其作为字符串返回的简单函数可能如下所示:

Private Function GetCurr(Input As String) As String
    Dim CurrCode As New CurrencySymbols
    If [Enum].TryParse(Of CurrencySymbols)(Input, CurrCode) Then
        GetCurr = ChrW(CurrCode)
    Else
        GetCurr = ChrW(0)
    End If
End Function

如果字符串无效,这将返回带有代码 0 字符的字符串

于 2013-10-29T03:47:27.790 回答
0

由您决定哪种解决方案更适合您和您的任务,但有一点是肯定的:您需要在某处初始化这些货币的功能,该功能在您的应用程序的初始化阶段调用,然后您可以使用任何货币通过吸气剂。

当然,您可以使用字典。此外,如果您确定没有不受信任的人会访问它,您可以使用 XML 文件。最后,您也可以将所有这些信息存储到数据库中。所以一切都取决于你的决定。

于 2013-10-29T02:39:55.373 回答