Метод расширения C # для типа данных String - PullRequest
2 голосов
/ 04 мая 2010

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

Например:

decimal myNumber = "15 cm".ToDecimal();

Ответы [ 7 ]

7 голосов
/ 04 мая 2010

Ожидаете ли вы, что пользователи разных «культур» будут использовать ваше приложение? Если так, то лучше учитывать региональные настройки пользователя:

static decimal ToDecimal(this string str)
{
    return Decimal.Parse(str, CultureInfo.CurrentCulture);
}

Или вы можете заменить каждый символ в строке, который не является цифрой или значением CultureInfo.CurrentCulture.NumberFormat.CurrencyDecimalSeparator, а затем проанализировать его как десятичное число.

EDIT:
Общепринято, что методы расширения должны иметь свое собственное пространство имен. Это позволит избежать конфликтов имен и вынудит конечного пользователя выборочно импортировать нужные ему расширения.

5 голосов
/ 04 мая 2010

Метод расширения имеет следующий вид:

public static class StringExtensions
{
    public static decimal ToDecimal(this string input)
    {
        //your conversion code here
    }
}
  • Содержащий класс должен быть статическим. Метод также является статическим. "это" ключевое слово. Я рекомендую соглашение о расширении группировки методы по типу, к которому они обратитесь, но нет требования к сделай так.

Вот руководство по написанию методов расширения.

1 голос
/ 04 мая 2010
  public static double ToDecimal(this string value)
        {
            ... your parsing magic
        }
1 голос
/ 04 мая 2010

Пожалуйста, прочитайте эту статью о реализации валюты http://msdn.microsoft.com/en-us/goglobal/bb688126.aspx

Пример:

Double myNumber = Double.Parse("$1,250.85", NumberStyles.Any);

PS. Вы пытаетесь разобрать значение с плавающей запятой в десятичный тип.

0 голосов
/ 04 мая 2010

Просто отвечая на вопрос, как создать метод расширения для строкового класса:

public static class MyStringExtensions {
public static ToDecimal(this string input) {
   // ...
}
}

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

0 голосов
/ 04 мая 2010

Самая большая проблема в том, что вы должны знать Культуру, в которой пользователь вводит число. В противном случае вы столкнетесь с большими проблемами.

Небольшим примером является чтение вашего номера как английского или немецкого.

В английском языке NumberFormatInfo.CurrencyDecimalSeparator является точкой (.), А NumberFormatInfo.CurrencyGroupSeparator является запятой (,). На немецком языке все наоборот. Таким образом, вы можете начать гадать, если пользователь имеет в виду тысячу двести пятьдесят или один и четвертый доллар.

Может быть, вы можете запустить все доступные культуры и проверить, содержит ли пользовательский ввод NumberFormatInfo.CurrencySymbol , а затем попробовать данную культуру. Но, может быть, есть культуры, которые используют один и тот же символ, но разные разделители.

Таким образом, чтобы это действительно заработало, у вас есть только два варианта: * Скажите своим пользователям, в каком культурном формате они должны ввести свои значения. * Дайте пользователю возможность рассказать, какую культуру они решили сделать.

Список всех доступных культур можно получить по CultureInfo.GetCultures ()

0 голосов
/ 04 мая 2010

Мне кажется, что наиболее подходящим способом решения этой проблемы является использование перегрузки Decimal.TryParse, которая принимает NumberStyles и культуру. Передайте его NumberStyles.Currency и соответствующую культуру.

Теперь ничто не мешает вам предоставить метод расширения на string, который вызывает это - но вам нужно учитывать, что вы хотите, чтобы значение d было после

decimal d = "ponies".ToDecimal();
...