双倍货币的字符串有错误的结果(逗号问题)

String to double currency has wrong result ( comma point issue)

现在我遇到这个问题,逗号和小数点以及千位分隔符。

我的程序从不同来源获取价格。

一些美国人一些欧洲人 有些价格是这样的 2000,0.20 for 20000.20

有些人喜欢 2000.0,20 又是 20000.20

我找不到让我的代码识别这两种格式的方法。 我尝试使用替换将逗号变成点,但如果数字中有千位分隔符,我会遇到问题。如何在没有这些问题的情况下将字符串转换为双精度?

我试过了 但如果有两种不同的文化,它就不起作用

            double.TryParse(price, NumberStyles.Currency, CultureInfo.InvariantCulture, out priceD);

除了尝试不同的文化以了解成功之外,我不知道还有什么更好的方法。

创建这样的方法:

public double CurrencyToDouble(string input)
{
    // Will hold the result
    double result = 0;

    // Try US culture
    if(double.TryParse(input, System.Globalization.NumberStyles.Currency, System.Globalization.CultureInfo.GetCultureInfo("en-US"), out result)) { return result; }

    // Try DE culture
    if (double.TryParse(input, System.Globalization.NumberStyles.Currency, System.Globalization.CultureInfo.GetCultureInfo("de-DE"), out result)) { return result; }

    // Try current system culture
    if(double.TryParse(input, System.Globalization.NumberStyles.Currency, System.Globalization.CultureInfo.CurrentCulture, out result)) { return result; }

    // Try invariant culture
    if(double.TryParse(input, System.Globalization.NumberStyles.Currency, System.Globalization.CultureInfo.InvariantCulture, out result)) { return result; }

    // Try more common cultures...

    // Unsuccessful, throw some kind of error
    throw new FormatException("Could not convert!");
}

输入:

CurrencyToDouble("2000,0.20");
CurrencyToDouble("2000.0,20");

输出:

20000.2
20000.2

这是我想出来的

double FixUnknownCurrency(string amountText)
{
    amountText = amountText?.Trim()?.Replace(" ", string.Empty);
    if(string.IsNullOrWhiteSpace(amountText))
        return 0d;  

    if(amountText.Length < 3)
        return double.Parse(amountText);

    var currencyDecimal = amountText[amountText.Length-3];
    if(Char.IsNumber(currencyDecimal))
        return double.Parse(amountText);

    if(currencyDecimal == '.' || currencyDecimal == ',')
    {
        amountText = amountText.Replace(",", string.Empty).Replace(".", string.Empty);
        return double.Parse(amountText) / 100d;
    }

    return double.Parse(amountText);
}

在这里试试。 运行 火车晚点:https://dotnetfiddle.net/HTiL4s