首页 > 解决方案 > 如何解析带有欧元货币符号的数字字符串?

问题描述

我无法让 decimal.TryParse 方法适用于带有欧元符号的货币。我已经尝试将符号放在末尾和空格后无济于事。我还尝试了不同的文化(“fr-FR”、“de-DE”)和数字样式(“Any”将它们全部组合在一起,除了十六进制)。尽管文化显示匹配的货币符号,但该方法失败。使用货币符号解析值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));
    }   
}

这是上面的一个小提琴

更新

恕我直言,建议的.NET:解析本地化货币和我研究的另一种货币并没有扩展问题的根源在于文化必须匹配数字格式的所有方面——感谢 @Zero0 和 @Dai 的扩展尽可能多的评论和接受的答案。

并不是说这不是我对其他货币格式的无知,而是看到这个问题被否决了暗示在这个领域几乎不能容忍错误。鉴于我在答案和评论中发现有价值的问题,我会继续发布问题——其他人也可以。

标签: c#.net

解决方案


改变

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

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

输出:

5432109.876

编辑:

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


推荐阅读