Наверняка всем неоднократно приходилось выделять числа из строк. Это довольно простая задача, если в строке записано только число, без разделителей, без указания валюты (в случае вывода стоимости), не используя экспоненциальное представление. Но порой это не так…
В C#, для того, чтобы получить число из строки, нужно воспользоваться функцией Parse (либо TryParse). Например так:
var strI = "123";
var strF = "123,8";
var iDigit = Int32.Parse(strI);
var fDigit = Double.Parse(strF);
Теперь немного усложним задачу, пусть нам нужно получить число из такой строки «$199», означающей стоимость чего-либо. Метод, использованный виде, без изменений работать не будет, так как строка содержит символ, отличный от числового. Первой мыслью, наверное, будет очистить строку от лишних символом, а затем преобразовать её в число. Да, это сработает, в данном конкретном случае, но это плохой вариант. Почему? А как на счет такого числа «31.57E04»?
Проблему с различными числами поможет решить перечисление NumberStyles. Подробнее об значениях, которые может принимать данное перечисление можно прочитать в MSDN. Я перечислю только некоторые
AllowCurrencySymbol — указывает, что строка может содержать символ денежной единицы.
AllowDecimalPoint — строка может содержать десятичный разделитель.
llowExponent — число в строке может быть представлено в экспоненциальном виде.
AllowHexSpecifier — число в строке представлено в шестнадцатеричном виде.
AllowParentheses — число может быть заключено в пару скобок, при этом такое число считается отрицательным.
AllowThousands — в строке может находиться разделители групп, отделяющие сотни от тысяч.
Сразу следует обратить внимание, что данное перечисление помечено атрибутом [FlagsAttribute]. О том, что это такое можно узнать здесь
Вернёмся к нашему числу «31.57E04», чтобы его правильно распознать, необходимо указать, что число может содержать десятичный разделитель и представлено в экспоненциальном виде.
const string strCost = "31.57E04";
var cost = Double.Parse(strCost, NumberStyles.AllowDecimalPoint | NumberStyles.AllowExponent);
Для значения суммы «$199»
const string strCost = "$199";
var cost = Double.Parse(strCost, NumberStyles.Currency);
Если же символ денежной единицы отличен от имеющихся, например используется «BYR», то нужный символ можно указать самому:
const string strCost = "199000 BYR";
var numberFormat = new NumberFormatInfo
{
CurrencySymbol = "BYR",
};
var cost = Double.Parse(strCost, NumberStyles.Currency, numberFormat);
Проверим работу с шестнадцатеричными числами:
const string hexStr = "AAFF";
var hexNumber = long.Parse(hexStr, NumberStyles.HexNumber);
Использование NumberStyles избавляет от необходимости создания множества «велосипедов».
Приятного программирования.