我想编写一个函数,它接受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来保持代码更简单,因为我预计不需要增加复杂性来支持更长的货币符号,特别是因为大多数货币都是非常模糊的货币无论如何,企业极不可能接受付款。
答案 0 :(得分: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的字符的字符串
答案 1 :(得分:0)
由您决定哪种解决方案更适合您和您的任务更好,但有一件事是肯定的:您需要一个初始化这些货币的功能,这在您的应用程序的初始化阶段调用,然后您可以通过吸气剂使用任何货币。
当然,你可以使用字典。此外,如果您确定没有不受信任的人可以访问它,您可以使用XML文件。最后,您还可以将所有这些信息存储到数据库中。所以一切都取决于你的决定。