Как определить, является ли строка валютой в c # - PullRequest
6 голосов
/ 27 августа 2011

Обычно, когда мне нужно преобразовать currency string (например, 1200,55 злотых или $ 1,249) в десятичное значение, я делаю это так:

if (currencyString.Contains("zł)) {
    decimal value = Decimal.Parse(dataToCheck.Trim(), NumberStyles.Number | NumberStyles.AllowCurrencySymbol);
}

Есть ли способ проверить, является ли строка валютойбез проверки конкретной валюты?

Ответы [ 4 ]

5 голосов
/ 27 августа 2011

Если вы просто выполните преобразование (вам также следует добавить | NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint), то, если строка содержит неправильный символ валюты для текущего пользовательского интерфейса, синтаксический анализ не будет выполнен - ​​в этом случае возникнет исключение.Если в нем нет символа валюты, анализ все равно будет работать.

Таким образом, вы можете использовать TryParse, чтобы учесть это и проверить на сбой.

Если вашими данными могут быть любые валюты, которые вы можете использовать эта версия TryParse, которая принимает IFormatProvider в качестве аргумента, с помощью которого вы можете указать специфическую для культуры информацию о разборе строки.Поэтому, если синтаксический анализ не выполняется для культуры пользовательского интерфейса по умолчанию, вы можете повторить попытку для каждой из поддерживаемых вами культур.Когда вы найдете тот, который работает, у вас есть и ваш номер, и тип валюты (злотый, доллар США, евро, рубль и т. Д.)

3 голосов
/ 27 августа 2011

Как я понимаю, лучше сделать:

decimal value = -1;
if (Decimal.TryParse(dataToCheck.Trim(), NumberStyles.Number | 
  NumberStyles.AllowCurrencySymbol,currentCulture, out value)
   {do something}

См. Джефф Этвуд Описание TryParse. Он не генерирует исключение и чрезвычайно быстро, чем Parse в исключительных случаях.

1 голос
/ 02 июня 2015

Чтобы проверить, является ли строка денежной суммой, которая будет использоваться для ввода заработной платы - я использовал это:

    public bool TestIfWages(string wages)
            {
                Regex regex = new Regex(@"^\d*\.?\d?\d?$");
                bool y = regex.IsMatch(wages);
                return y;
            }
1 голос
/ 27 августа 2011

Вы можете попробовать найти в строке то, что вы считаете символом валюты, а затем поискать ее в словаре, чтобы узнать, действительно ли это символ валюты.Я просто смотрю на начало и конец строки и выбираю все, что не является цифрой, тогда это то, что вы ищите.(Если на обоих концах есть что-то, то я думаю, что вы можете предположить, что это не валюта.)

Преимущество этого подхода состоит в том, что вам нужно только отсканировать строку, и вам не нужно тестировать отдельнодля каждой валюты.

Вот пример того, что я имел в виду, хотя, вероятно, можно было бы использовать некоторые уточнения:

class Program
{
    private static ISet<string> _currencySymbols = new HashSet<string>() { "$", "zł", "€", "£" };

    private static bool StringIsCurrency(string str)
    {
        // Scan the beginning of the string until you get to the first digit
        for (int i = 0; i < str.Length; i++)
        {
            if (char.IsDigit(str[i]))
            {
                if (i == 0)
                {
                    break;
                }
                else
                {
                    return StringIsCurrencySymbol(str.Substring(0, i).TrimEnd());
                }
            }
        }
        // Scan the end of the string until you get to the last digit
        for (int i = 0, pos = str.Length - 1; i < str.Length; i++, pos--)
        {
            if (char.IsDigit(str[pos]))
            {
                if (i == 0)
                {
                    break;
                }
                else
                {
                    return StringIsCurrencySymbol(str.Substring(pos + 1, str.Length - pos - 1).TrimStart());
                }
            }
        }
        // No currency symbol found
        return false;
    }

    private static bool StringIsCurrencySymbol(string symbol)
    {
        return _currencySymbols.Contains(symbol);
    }

    static void Main(string[] args)
    {
        Test("$1000.00");
        Test("500 zł");
        Test("987");
        Test("book");
        Test("20 €");
        Test("99£");
    }

    private static void Test(string testString)
    {
        Console.WriteLine(testString + ": " + StringIsCurrency(testString));
    }
}
...