【发布时间】:2020-09-11 02:20:50
【问题描述】:
我无法让 decimal.TryParse 方法适用于带有欧元符号的货币。我已经尝试将符号放在末尾和空格后无济于事。我还尝试了不同的文化(“fr-FR”、“de-DE”)和数字样式(“Any”将它们全部组合在一起,除了十六进制)。尽管文化显示匹配的货币符号,但该方法失败。 Parse value with Currency symbol SO 解决方案不起作用。
using System;
using System.Globalization;
public class Program
{
public static void Main()
{
var value = "€5,432,109.876";
var cultureInfo = CultureInfo.CreateSpecificCulture("de-DE");
decimal result;
if (!decimal.TryParse(value, NumberStyles.Any, cultureInfo, out result))
{
Console.WriteLine(string.Format("Unable to parse '{0}' as a number using the '{1}' culture with currency symbol '{2}'.", value, cultureInfo.IetfLanguageTag, cultureInfo.NumberFormat.CurrencySymbol));
return;
}
Console.WriteLine(result.ToString(cultureInfo));
}
}
这是fiddle 上面的内容。
更新
恕我直言,建议的 .NET: Parsing localized currency 和我研究的另一个问题没有详细说明问题的根源是文化必须匹配数字格式的所有方面——感谢@Zero0 和 @Dai 尽可能多地扩展 cmets 并接受答案。
并不是我对其他货币格式一无所知,而是看到这个问题被否决,暗示在这个领域几乎不能容忍错误。鉴于我在答案和 cmets 中发现了价值,我会继续发布问题——其他人也可以。
【问题讨论】:
-
de-DE和fr-FR不起作用,因为它们使用点而不是逗号进行数字分组。 -
您需要使用与您尝试解析的字符串格式相匹配的区域性。您的格式化字符串与您尝试使用的
de-DE文化不匹配。只需为字符串使用正确的文化。查看副本。 -
如果您的输入是强加给您的,您可能正在寻找以下详细信息:cultureInfo.NumberFormat.CurrencyPositivePattern = 0; // 开头没有空格cultureInfo.NumberFormat.CurrencyDecimalSeparator = "."; // 强制十进制为句点cultureInfo.NumberFormat.CurrencyGroupSeparator = ","; // 强制千位为逗号