字符串到自定义类型替换

时间:2013-10-29 00:00:38

标签: vb.net dictionary .net-4.0 currency cultureinfo

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

  1. 检查空字符串或空字符串。
  2. 将代码转换为相应的货币符号(例如“$”,“£”,“¥”,如上所述)。
  3. 使用适当的符号格式化返回的字符串。
  4. 我有两种格式:有美分,没有。在日元的情况下,从来没有美分,所以在这种情况下,我总是会返回非美分(而不是废话,: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来保持代码更简单,因为我预计不需要增加复杂性来支持更长的货币符号,特别是因为大多数货币都是非常模糊的货币无论如何,企业极不可能接受付款。

2 个答案:

答案 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文件。最后,您还可以将所有这些信息存储到数据库中。所以一切都取决于你的决定。