解析字符串包括货币代码?

时间:2017-01-26 04:12:08

标签: c#

我知道有很多类似的问题解释了如何解析带有货币符号的字符串。在这里,我想使用货币ISO-4217代码(https://en.wikipedia.org/wiki/ISO_4217)。

decimal.Parse("45,000.00 USD", System.Globalization.NumberStyles.AllowDecimalPoint)
decimal.Parse("45.00 USD")
decimal.Parse("USD 45.00")
decimal.Parse("USD45.00")
decimal.Parse("45.00USD")
decimal.Parse("45.00 RUP")
decimal.Parse("IND 45.00")
decimal.Parse("45.00 EUR")
decimal.Parse("INR 45.00")

我正在考虑使用正则表达式的解决方案,但也许有更多的直接解决方案或.NET lib中已经存在的东西。我不知道。

4 个答案:

答案 0 :(得分:1)

您可以使用NumberFormatInfo。

参见我在下面写的例子。

var nmfi = new NumberFormatInfo();
nmfi.NegativeSign = "-";
nmfi.CurrencySymbol = "USD";
nmfi.CurrencyDecimalSeparator = ".";
nmfi.CurrencyGroupSeparator = ",";

var result1 = decimal.Parse("USD45.00", NumberStyles.Currency, nmfi);
var result2 = decimal.Parse("45.00USD", NumberStyles.Currency, nmfi);
var result3 = decimal.Parse("45.00 USD", NumberStyles.Currency, nmfi);

答案 1 :(得分:0)

此刻我没有比我更好的解决方案

public static decimal Parse(string s)
{
    if (string.IsNullOrEmpty(s))
        throw new ArgumentNullException("s is null");
    var match = Regex.Match(s, "[A-Z]{3}");
    if (!match.Success)
        throw new FormatException("s is not in the correct format. Currency code is not found.");
    s = s.Replace(match.Value, string.Empty); // I don't like this line
    decimal value = decimal.Parse(s, NumberStyles.Currency);
    return value;
}

在我的代码中,我使用Money对象。货币由小数值和3个字符的货币代码组成。

public static Money Parse(string s)
{
    if (string.IsNullOrEmpty(s))
        throw new ArgumentNullException("s is null");
    var match = Regex.Match(s, "[A-Z]{3}");
    if (!match.Success)
        throw new FormatException("s is not in the correct format. Currency code is not found.");
    s = s.Replace(match.Value, string.Empty); // I don't like this line
    decimal value = decimal.Parse(s, NumberStyles.Currency);
    return new Money(value, (CurrencyCode)Enum.Parse(typeof(CurrencyCode), match.Value));
}

答案 2 :(得分:0)

这里最好的选择是将十进制数字与其格式捆绑在一起,这样您就可以轻松了解该值的货币。我创建了IsoDecimal帮助struct来帮助解决这个问题。

void Main()
{
    var arr = new string[]
    {
        "45,000.00 USD" ,
        "45.00 USD"     ,
        "USD 45.00"     ,
        "USD45.00"      ,
        "45.00USD"      ,
        "45.00 RUP"     ,
        "IND 45.00"     ,
        "45.00 EUR"     ,
        "INR 45.00"    
    };

   foreach (var num in arr)
   {
        Console.WriteLine(new IsoDecimal(num).ToString());
   }
}

struct就在这里。

public struct IsoDecimal
{
    private NumberFormatInfo numberFormat { get; set; }
    private decimal value { get; set; }

    public IsoDecimal(string strValue)
    {
        string strNumber = Regex.Match(strValue, @"[\d.\-,]+").Value;
        string code = Regex.Match(strValue, @"[A-Z]+").Value;

        numberFormat = new NumberFormatInfo();
        numberFormat.NegativeSign = "-";
        numberFormat.CurrencyDecimalSeparator = ".";
        numberFormat.CurrencyGroupSeparator = ",";
        numberFormat.CurrencySymbol = code;

        value = Decimal.Parse(strNumber);
    }

    public static implicit operator decimal(IsoDecimal isoDecimal)
    {
        return isoDecimal.value;
    }

    public override string ToString()
    {
        return ToString("C");
    }

    public string ToString(string format)
    {
        return value.ToString(format, numberFormat);
    }
}

struct允许您根据需要随意将其值分配给decimal变量,并覆盖Object.ToString,以便无缝集成和使用。

答案 3 :(得分:-1)

你可以使用正则表达式

Decimal.Parse(Regex.Match("USD 45.00", @"(\d+(\.\d+)?)").Value);