【问题标题】:How can I parse a numeric string with the euro currency symbol? [duplicate]如何解析带有欧元货币符号的数字字符串? [复制]
【发布时间】: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-DEfr-FR 不起作用,因为它们使用点而不是逗号进行数字分组。
  • 您需要使用与您尝试解析的字符串格式相匹配的区域性。您的格式化字符串与您尝试使用的 de-DE 文化不匹配。只需为字符串使用正确的文化。查看副本。
  • 如果您的输入是强加给您的,您可能正在寻找以下详细信息:cultureInfo.NumberFormat.CurrencyPositivePattern = 0; // 开头没有空格cultureInfo.NumberFormat.CurrencyDecimalSeparator = "."; // 强制十进制为句点cultureInfo.NumberFormat.CurrencyGroupSeparator = ","; // 强制千位为逗号

标签: c# .net


【解决方案1】:

改变

var cultureInfo = CultureInfo.CreateSpecificCulture("de-DE");

var cultureInfo = CultureInfo.CreateSpecificCulture("en-IE");

输出:

5432109.876

编辑:

正如 cmets 中所述,这是因为文化的逗号数字分组。这个答案恰好匹配(所以它有效),但我同意同样重要的是要注意为什么这种文化在其他人不适用的情况下有效。

【讨论】:

  • 虽然这有效(因为爱尔兰使用英文逗号进行数字分组),但我们是否知道该号码实际上来自爱尔兰而不是其他文化?我觉得更好的解决方案是为IFormatInfo 参数使用专门配置的NumberFormatInfo 对象,而不是整个CultureInfo
  • 我明白你的意思。简短的回答有效——谢谢!长答案有点像“你必须将数字的所有方面与特定文化相匹配”——也谢谢!
猜你喜欢
  • 2015-10-05
  • 2020-09-15
  • 2012-12-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 2015-02-17
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多