Метод расширения С# для типа данных строки
Мое веб-приложение имеет дело со строками, которые нужно много преобразовать в числа - пользователи часто помещают запятые, единицы (например, cm, m, g, kg) и символы валюты в этих полях, поэтому я хочу создать метод расширения строки, который очищает поле вверх и преобразует его в десятичную.
Например:
decimal myNumber = "15 cm".ToDecimal();
Ответы
Ответ 1
Ожидаете ли вы пользователей разных "культур" использовать ваше приложение? Если это так, то лучше учитывать региональные настройки пользователя:
static decimal ToDecimal(this string str)
{
return Decimal.Parse(str, CultureInfo.CurrentCulture);
}
Или вы можете заменить каждый символ в str, который не является цифрой или значением CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator
, а затем проанализировать ее как десятичную.
EDIT:
Общепринято, что методы расширения должны иметь собственное пространство имен. Это позволит избежать конфликтов имен и заставить конечного пользователя выборочно импортировать необходимые им расширения.
Ответ 2
Метод расширения имеет следующий вид:
public static class StringExtensions
{
public static decimal ToDecimal(this string input)
{
//your conversion code here
}
}
- Содержащий класс должен быть статическим.
Этот метод также статичен. Примечание.
"this" ключевое слово. Я рекомендую
соглашение о расширении группировки
методов по типу, к которому они
обратитесь, но нет требования
сделайте это.
Ниже приведено руководство для написания методов расширения.
Ответ 3
Прочитайте эту статью о реализации валюты http://msdn.microsoft.com/en-us/goglobal/bb688126.aspx
Пример:
Double myNumber = Double.Parse("$1,250.85", NumberStyles.Any);
PS. Вы пытаетесь разделить значение с плавающей запятой на десятичный тип.
Ответ 4
public static double ToDecimal(this string value)
{
... your parsing magic
}
Ответ 5
Наиболее подходящим способом решения этой проблемы является использование перегрузки Decimal.TryParse
, которая принимает NumberStyles
и культуру. Передайте его NumberStyles.Currency
и соответствующую культуру.
Теперь ничего не мешает вам предоставить метод расширения для string
, который вызывает это, но вам нужно подумать о том, что вам нужно, чтобы значение d
было после
decimal d = "ponies".ToDecimal();
Ответ 6
Самая большая проблема заключается в том, что вы должны знать Культуру, в которую пользователь вводит номер. В противном случае вы столкнетесь с большими проблемами.
Маленьким примером является чтение вашего номера как английского, так и немецкого.
На английском языке NumberFormatInfo.CurrencyDecimalSeparator является точкой (.) и NumberFormatInfo.CurrencyGroupSeparator является запятой (,). В нем все наоборот. Таким образом, вы можете начать дикое угадывание, если пользователь означает тысячу двести пятьдесят или один и четвертый доллар.
Возможно, вы можете запустить все доступные Культуры и проверить, содержит ли ваш вход пользователя NumberFormatInfo.CurrencySymbol, а затем попробуйте данную культуру. Но, возможно, есть культуры, которые используют один и тот же символ, но разные разделители.
Итак, чтобы это действительно сработало, у вас есть только два варианта:
* Сообщите своим пользователям, в какой формат культуры они должны ввести свои значения.
* Дайте пользователю возможность рассказать вам, какую культуру они решили сделать.
Список всех доступных культур можно получить CultureInfo.GetCultures()
Ответ 7
Просто отвечая на вопрос, как создать метод расширения для класса string:
public static class MyStringExtensions {
public static ToDecimal(this string input) {
// ...
}
}
(и вам нужно иметь оператор using для пространства имен, в котором оно расположено для его использования)