2016-12-21 12 views
-1

Теперь у меня есть эта проблема здесь с запятой и точкой в ​​десятичной точке и разделителем тысяч.Строка для двойной валюты имеет неправильный результат (пункт запятой)

Моя программа получает цены из разных источников.

некоторых американских некоторых европейских Некоторые цены приходит как это 2000,0.20 для 20000.20

и некоторые, как 2000.0,20 для вновь 20000.20

Я не мог найти способ, чтобы сделать свой код, чтобы признать эти два формата. Я попытался использовать replace, чтобы повернуть запятую в точку, но если в номере есть тысячи разделителей, у меня возникают проблемы. как можно преобразовать строку в double без таких проблем?

Я попробовал этот , но его просто не работают, если есть две разные культуры

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

Я не знаю, почему задание вопроса дало бы мне нижний план. я думаю, мне нужно идти вперед и закрывать –

ответ

1

Это то, что я придумал

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

+0

работает на американском и европейском. Мне просто нужно проверить восточные форматы, чтобы быть уверенным. то я поставил бы этот пост как решенный. Спасибо чувак –

0

Я не знаю лучшего способа, кроме пробовать различные культуры, чтобы увидеть, что преуспевает.

Создать метод, как это:

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

+0

от 116.9 я получаю 1169 –

+0

Не просто скопировать и вставить код, узнать, почему он работает или не работает. В этом случае я предполагаю, что ваша системная культура - это нечто иное, чем en-US, и поэтому число будет отформатировано неправильно. Я добавил строку, чтобы сначала попробовать en-US. Вы знаете, где расположены эти API, чтобы вы могли добавить правильные культуры. – Equalsk