在C#中将任何货币转换为十进制的最佳方法是什么?
public static decimal returnDecimalFromCurrency(string dataToCheck) {
decimal varValue;
if (!Decimal.TryParse(dataToCheck, NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.CurrentCulture, out varValue)) {
varValue = decimal.MinValue;
}
return varValue;
}
但这只适用于我现有的货币。如果我通过它欧元货币它将不会被转换。
或唯一的方法是始终检查它是什么货币并传递正确的CultureInfo
:
CultureInfo.GetCultureInfo("pl-PL")
,磅为CultureInfo.GetCultureInfo("en-GB")
?
编辑:
或者这可能是快速的“工作”黑客?
Decimal.TryParse(dataToCheck.Trim().Replace("zł", "").Replace("€", ""), NumberStyles.Number | NumberStyles.AllowCurrencySymbol, CultureInfo.GetCultureInfo("pl-PL"), out varValue)
但说实话,我真的不喜欢它。
答案 0 :(得分:2)
我会避免尝试使用Decimal.TryParse解析货币,而是剥离货币 - 将结果字符串提供给TryParse。单独处理货币 - 当然,如果您需要多次执行此操作,请创建一个功能。
答案 1 :(得分:1)
这对我有用,我希望它对你也有帮助:
public static decimal Parse(string currencyString)
{
return Parse(currencyString, Thread.CurrentThread.CurrentCulture);
}
public static decimal Parse(string currencyString, CultureInfo culture)
{
currencyString = currencyString.Replace(culture.NumberFormat.CurrencySymbol, System.String.Empty);
var value = Convert.ToDecimal(currencyString, culture);
return value;
}
答案 2 :(得分:0)
我用混合方法解决了同样的问题。正则表达式忽略句点,逗号,括号(在我的情况下,我知道负数在括号中),数字相当简单。只需使用它来找到你的符号,然后从中建立一种文化。然后解析。
//[^\d\.,()]+ all non-digit, non-period, non-comma, non-parenthesis chars
var regex = new Regex("[^\\d\\.,()]+");
var match = regex.Match(currencyString);
if(match == null){ //throw exception }
var currencySymbol = match.Value;
var cultureInfo = Thread.CurrentThread.CurrentCulture.Clone() as CultureInfo;
cultureInfo.NumberFormat.CurrencySymbol = currencySymbol;
var decimalValue = Decimal.Parse(currencyString, NumberStyles.Currency, cultureInfo);
答案 3 :(得分:0)
我今天遇到了这个问题,最后我只是循环遍历所有文化,并将每个文化传递给TryParse函数。
var myString = "$400.01";
var result = 0.0m;
var culture = System.Globalization.CultureInfo.GetCultures(System.Globalization.CultureTypes.AllCultures)
.First(c => decimal.TryParse(myString, System.Globalization.NumberStyles.Currency, c, out value))
// result = 400.01m