我想编写一个函数,它接受一个currencyCode As String
输入参数并输出一个自定义的currencyFormatString
. 我的困境是决定最好的(正确的)方法来做到这一点。currencyCode
是ISO 4217货币代码(例如“USD”、“GBP”、“JPY”等),我想执行以下步骤:
- 检查空字符串或空字符串。
- 将代码转换为相应的货币符号(如上面的“$”、“£”、“¥”)。
- 使用适当的符号格式化返回的字符串。
我有两种格式化情况:有美分和没有美分。在日元的情况下,从来没有美分,所以在这种情况下,我总是会返回非美分(不是废话,: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 以使代码更简单一些,因为我预计不需要增加复杂性来支持更长的货币符号,特别是因为它们中的大多数都是非常晦涩的货币,企业会无论如何都不太可能接受付款。