C# 正在分析包含货币代码的字符串?

C# 正在分析包含货币代码的字符串?,c#,C#,我知道有很多问题类似于这个问题,解释如何解析带有货币符号的字符串。在这里,我想做同样的事情,但货币ISO-4217代码() 我在考虑使用正则表达式的解决方案,但可能有更直接的解决方案,或者.NETlib中已经存在的一些解决方案。我不知道。你可以用正则表达式 Decimal.Parse(Regex.Match("USD 45.00", @"(\d+(\.\d+)?)").Value); 您可以使用NumberFormatInfo 请看下面我写的例子 var nmfi = new NumberFo

我知道有很多问题类似于这个问题,解释如何解析带有货币符号的字符串。在这里,我想做同样的事情,但货币ISO-4217代码()

我在考虑使用正则表达式的解决方案,但可能有更直接的解决方案,或者.NETlib中已经存在的一些解决方案。我不知道。

你可以用正则表达式

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

您可以使用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);

现在我没有比我更好的解决办法了

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));
}

您最好的选择是将十进制数与其格式捆绑在一起,这样您就可以很容易地知道该值用于何种货币。我已经创建了
IsoDecimal
helper
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
变量,并且它覆盖了
对象。ToString
可以无缝集成和使用。

这只是一个代码和所有代码吗?这是不正确的。您的正则表达式不包含小数。此示例仅适用于特定符号。这里是美元。1.“USD”不是一个符号。将其用作CurrencySymbol与其说是解决方案,不如说是一种变通方法。2.它可以与许多不同的货币代码一起使用。我现在没有检查货币是否存在。@ngeksyo您回复的人是OP,所以告诉他们他们误解了这个问题有点奇怪。也就是说,最初的问题只是询问美元的例子。如果你想去掉货币符号,只提取你想要的数字,这个解决方案很好。@B412,我刚刚开始将(javascript)转换成C。如果你想合作,请在gmail.com向makaretu发送电子邮件,我认为即使这样,最好的机器人也能阅读你的电子邮件。
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);
    }
}