Метод расширения С# для типа данных строки

Мое веб-приложение имеет дело со строками, которые нужно много преобразовать в числа - пользователи часто помещают запятые, единицы (например, 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 для пространства имен, в котором оно расположено для его использования)