Как я могу использовать Convert.ChangeType для преобразования строки в числа с разделителем группы? - PullRequest
2 голосов
/ 08 марта 2010

Я хочу сделать общий преобразователь строки в числовой и предоставить его как расширение строки, поэтому я написал следующий код:

public static bool TryParse<T>( this string text, out T result, IFormatProvider formatProvider ) where T : struct
try
{
   result = (T)Convert.ChangeType( text, typeof( T ), formatProvider );
   return true;
}
catch(...

Я называю это так:

int value;
var ok = "123".TryParse(out value, NumberFormatInfo.CurrentInfo)

Работает нормально, пока я не хочу использовать разделитель групп: Так как я живу во Франции, где разделитель тысяч - это пробел, а разделитель десятичных знаков - запятая, строка «1 234 567,89» должна быть равна 1234567,89 (в инвариантной культуре). Но функция вылетает!

При попытке выполнить неуниверсальное преобразование, например double.Parse(...),, я могу использовать перегрузку, которая принимает параметр NumberStyles. Я указываю NumberStyles.Number, и на этот раз он работает!

Итак, вопросы:

  • Почему синтаксический анализ не учитывает мой NumberFormatInfo (где NumberGroupSeparator хорошо указан для пробела, как я указал в моей ОС)
  • Как я могу заставить работать универсальную версию с Convert.ChangeTime, поскольку она не перегружена, принимая параметр NumberStyles?

1 Ответ

3 голосов
/ 08 марта 2010

Попробуйте явно указать культуру "fr-FR":

CultureInfo c = new CultureInfo("fr-FR");
double d = 0;
if ("1 234 567,89".TryParse<double>(out d, c)) {
    Console.WriteLine(d);
}

РЕДАКТИРОВАТЬ : этот пример работает правильно:

static class Extension {
    public static bool TryParse<T>(this string text, out T result, IFormatProvider formatProvider) where T : struct {
        result = default(T);
        try {
            result = (T)Convert.ChangeType(text, typeof(T), formatProvider);
            return true;
        } catch {
            return false;
        }
    }

}

class Program {
    static void Main(string[] args) {
        CultureInfo c = new CultureInfo("fr-FR");
        double d = 0;
        // NumberGroupSeparator in fr-FR culture is space
        bool res = "123 456,78".TryParse<double>(out d, c);
        // Set separator as '.' and parse string with dots
        c.NumberFormat.NumberGroupSeparator = ".";
        res = "123.456,78".TryParse<double>(out d, c);
    }
}

Est-ce que ca marche comme ca? :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...