Вы можете попробовать найти в строке то, что вы считаете символом валюты, а затем поискать ее в словаре, чтобы узнать, действительно ли это символ валюты.Я просто смотрю на начало и конец строки и выбираю все, что не является цифрой, тогда это то, что вы ищите.(Если на обоих концах есть что-то, то я думаю, что вы можете предположить, что это не валюта.)
Преимущество этого подхода состоит в том, что вам нужно только отсканировать строку, и вам не нужно тестировать отдельнодля каждой валюты.
Вот пример того, что я имел в виду, хотя, вероятно, можно было бы использовать некоторые уточнения:
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));
}
}