Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2013, 07:07   #11
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

либо в строке перед Convert.ToDouble заменяйте запятую (или точку) на тот разделитель, который является десятичным разделителем в текущей локали.

Последний раз редактировалось Serge_Bliznykov; 08.10.2013 в 08:45.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.10.2013, 08:14   #12
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Моё решение:
Код:
public Double DecSepIrrelevantDoubleParse(string input)
{
    double result = 0.0;
    // the culture order is important !
    System.Globalization.CultureInfo[] cultures = 
    { 
        new System.Globalization.CultureInfo("ru-RU"), 
        new System.Globalization.CultureInfo("en-US")
    };
    foreach (System.Globalization.CultureInfo culture in cultures)
    {
        try
        {
            result = double.Parse(input, culture);
            break;
        }
        catch
        {
            result = 0.0;
            continue;
        }
    }
    return result;
}
Оно съедает и точку и запятую, корректно получая даблу.
По желанию могу в экстеншн обернуть.

Serge, прошу простить великодушно за сию мою дерзость

Последний раз редактировалось phomm; 08.10.2013 в 08:19.
phomm вне форума Ответить с цитированием
Старый 08.10.2013, 08:41   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

phomm, чего там извиняться, нормальное, рабочее решение!


а ещё можно задать разделитель "точка" принудительно.
Вот так, примерно:
Код:
            Application.CurrentCulture = new System.Globalization.CultureInfo("ru-RU");
            System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("ru");
            Application.CurrentCulture.NumberFormat.NumberDecimalSeparator = ".";
            Application.CurrentCulture.NumberFormat.NumberGroupSeparator = " ";
            Application.CurrentCulture.DateTimeFormat.ShortDatePattern = "dd.MM.yyyy";
После этого точкой в качестве разделителя целой и дробной части должна нормально обрабатываться!


код чужой, так что я его пояснить не берусь, сорри...

Последний раз редактировалось Serge_Bliznykov; 08.10.2013 в 08:45.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 08.10.2013, 13:29   #14
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
result = double.Parse(input, culture);
Строго говоря, лучше воспользоваться методом Double.TryParse, который не генерирует исключение в случае некорректной строки
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 08.10.2013, 20:18   #15
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Хм, ну смысл представленного кода как раз такой, что схватив исключение, он станет пробовать следующую культуру для распарсивания.
Вообще я сперва хотел на трайпарсе написать, но потом передумал.
Надо, конечно, потестить этот метод, может действительно надо будет отрегулировать работу с исключениями.
phomm вне форума Ответить с цитированием
Старый 09.10.2013, 01:02   #16
hitman12
Пользователь
 
Аватар для hitman12
 
Регистрация: 20.09.2009
Сообщений: 88
По умолчанию

завтра затестим)
hitman12 вне форума Ответить с цитированием
Старый 10.10.2013, 11:41   #17
hitman12
Пользователь
 
Аватар для hitman12
 
Регистрация: 20.09.2009
Сообщений: 88
По умолчанию

Цитата:
Сообщение от phomm Посмотреть сообщение
Моё решение:
Код:
public Double DecSepIrrelevantDoubleParse(string input)
{
    double result = 0.0;
    // the culture order is important !
    System.Globalization.CultureInfo[] cultures = 
    { 
        new System.Globalization.CultureInfo("ru-RU"), 
        new System.Globalization.CultureInfo("en-US")
    };
    foreach (System.Globalization.CultureInfo culture in cultures)
    {
        try
        {
            result = double.Parse(input, culture);
            break;
        }
        catch
        {
            result = 0.0;
            continue;
        }
    }
    return result;
}
Оно съедает и точку и запятую, корректно получая даблу.
По желанию могу в экстеншн обернуть.

Serge, прошу простить великодушно за сию мою дерзость
метод работает но у меня там строка разбивается на 6 подстрок и вгоняется каждая в свой массив вследствии чего вызывается данный метод 5 раз на одной строке, а самих строк до 3000 и программка разбивает на подстроки уж больно медленно. Как изменить в консольном проекте региональные настройки что бы он думал что в асашей находится? и тогда проблема бы решилась сама по себе)
hitman12 вне форума Ответить с цитированием
Старый 10.10.2013, 11:53   #18
hitman12
Пользователь
 
Аватар для hitman12
 
Регистрация: 20.09.2009
Сообщений: 88
По умолчанию

Когда в винформ делаешь понятно все вроде:
Код:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-En");
System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.CreateSpecificCulture("en-En");
 
System.Globalization.CultureInfo culture = new System.Globalization.CultureInfo(Application.CurrentCulture.Name);
            culture.NumberFormat.CurrencyDecimalSeparator = ".";
            Application.CurrentCulture = culture;
а как организовать тоже самое на консольном проекте?
hitman12 вне форума Ответить с цитированием
Старый 10.10.2013, 14:45   #19
simples
Форумчанин
 
Регистрация: 03.10.2013
Сообщений: 142
По умолчанию

Код:
var newCulture = new CultureInfo(Thread.CurrentThread.CurrentCulture.Name);
newCulture.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = newCulture;
simples вне форума Ответить с цитированием
Старый 10.10.2013, 15:01   #20
eval
Подтвердите свой е-майл
 
Регистрация: 29.08.2012
Сообщений: 4,011
По умолчанию

застрелить, нельзя помиловать
eval вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
MidletPascal - Ожидание нажатия команды Artem_Kokos Java Мобильная разработка (Android) 0 16.08.2012 20:40
Постоянное программирование Rost93 Компьютерное железо 7 24.07.2012 22:00
Постоянное значение поля Nenado БД в Delphi 2 26.01.2012 16:33
формула на постоянное уменьшение terminda12 Microsoft Office Excel 4 29.07.2011 23:52
Постоянное выдергивание из базы CodeNOT JavaScript, Ajax 0 01.07.2011 14:20