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