С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
1
.NET 4.x

Можно ли заставить double.Parse обрабатывать числа с разными разделителями?

21.06.2018, 16:37. Показов 4911. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет!

Есть фреймворк, который подключен к проекту в виде библиотеки. В одном из сценариев работы фреймвор должен преобразовать строку в число типа double. Выглядит это как-то так:

C#
1
PromptDialog.Number(context, Callback, $"Введите сумму к оплате");
В методе Callback есть параметр типа IAwaitable<double> result, из которого можно получить значение:

C#
1
var aaa = await result;
И вот на этой строке вылетает System.FormatException, если сумму ввели в виде 10.5 (т.е. через точку, а не запятую). Если ввести 10,5 -порядок.

Полазив по исходникам я надыбал такое:

C#
1
Func<RecognizeEntity<string>, RecognizeEntity<double>> selector = (x => new RecognizeEntity<double> { Entity = double.Parse(x.Entity), Score = x.Score });
Я не уверен на 100%, что это именно то место, где происходит исключение, но предполагаю, что исключение вылетает там на операции double.Parse(x.Entity). Как-то обработать строку, прежде чем она попадет туда я не могу, т.к. все происходит внутри фреймворка. Поменять что-то в самом фреймворе тоже нельзя.

Вопрос: можно ли какими-то настройками (проекта, операционной системы, среды CLR или чего-либо на компе) добиться того, что бы операция double.Parse корректно работала и с точкой (10.5) и с запятой (10,5).
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.06.2018, 16:37
Ответы с готовыми решениями:

Разделить строку с 2-мя разными разделителями
Добрый вечер. Есть строка: login@domen:pass Как разбить её на 3 части? Пробовал функцию:...

JSON.parse() не хочет обрабатывать данные, полученные из php
$.ajax( { type: 'POST', url: &quot;php/reg.php&quot;, data: { login: login, password: pass,...

Прочитать данные из многоуровневой вложенной структуры файлов с разными разделителями
Подскажите пожалуйста с чего начать, установил python 2.7, скачал sqlite3, задача такая: есть папка...

Заставить chrome обрабатывать протоколы tel: и callto:
Ничего не происходит. Ни вопроса, ни запрета, ни окна выбора приложения -- тупо тишина. Лиса...

22
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
21.06.2018, 16:57 2
Цитата Сообщение от V0fka Посмотреть сообщение
добиться того, что бы операция double.Parse корректно работала и с точкой (10.5) и с запятой (10,5).
Пробуйте распарсить сначала так, потом эдак:
C#
1
2
3
4
5
6
7
static readonly CultureInfo ru = CultureInfo.GetCultureInfo("ru-RU");
bool TryParse(string input, out double result)
{
    var @decimal = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite;
    return double.TryParse(input, @decimal, CultureInfo.InvariantCulture, out result) ||
        double.TryParse(input, @decimal, ru, out result);
}
Ну и, конечно же, не используйте double там, где должна использоваться decimal: при работе с деньгами.
1
86 / 13 / 1
Регистрация: 24.05.2010
Сообщений: 590
25.06.2018, 09:11  [ТС] 3
kolorotur, ну это немножко не то . Оно парсится внутри фреймворка и влезть туда я не могу. Думал, может можно как-то настройками ОС или чего-то ещё повлиять на этот процесс. Но если этого сделать нельзя, то придется, наверное, отказаться от использования функции фреймворка (в конкретном сценарии) и самому брать строку и обрабатывать её. Для этого с радостью воспользуюсь вашим кодом . Не хотелось этого делать, т.к. помимо самой обработки придется описывать логику работы в случае если ввели какую-то ерунду и ещё некоторые моменты. Спасибо за ответ!
0
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
25.06.2018, 09:47 4
Цитата Сообщение от V0fka Посмотреть сообщение
ну это немножко не то
В чем именно не то?
Вы спросили:
Цитата Сообщение от V0fka Посмотреть сообщение
можно ли какими-то настройками (проекта, операционной системы, среды CLR или чего-либо на компе) добиться того, что бы операция double.Parse корректно работала и с точкой (10.5) и с запятой (10,5).
Вышеприведенный метод делает именно это.

Цитата Сообщение от V0fka Посмотреть сообщение
Думал, может можно как-то настройками ОС или чего-то ещё повлиять на этот процесс.
Можно, но в данном случае не нужно.

Цитата Сообщение от V0fka Посмотреть сообщение
Не хотелось этого делать, т.к. помимо самой обработки придется описывать логику работы в случае если ввели какую-то ерунду и ещё некоторые моменты.
Приведенный метод это все учитывает.
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 09:54 5
Цитата Сообщение от kolorotur Посмотреть сообщение
В чем именно не то?
Ему надо, чтоб в постороннем коде именно метод double.TryParse(string input, out double result) стал понимать любой формат.
1
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
25.06.2018, 10:10 6
Цитата Сообщение от Rius Посмотреть сообщение
Ему надо, чтоб в постороннем коде именно метод double.TryParse(string input, out double result) стал понимать любой формат.
Понял, похоже невнимательно вопрос прочитал.
Спасибо!

V0fka, если у вас есть доступ к введенной строке до того, как она будет передана в посторонний метод, то как вариант вы можете перед передачей сконвертировать ее в double, используя приведенный выше метод, а во фреймворк передавать уже распарсенное значение, снова сконвертированное в строку — чтобы оно имело вид, который может быть распарсен при текущих региональных настройках.
Параллельно можно сообщить об этом баге разработчикам фреймворка.
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 10:21 7
Лучший ответ Сообщение было отмечено V0fka как решение

Решение

Нет у него доступа, походу.
Вызывает метод показа окна для ввода текста, и уже оно использует где-то внутри этот метод с культурой потока.

Можно костылями смены культуры потока обложить этот вызов, но чую это чревато багами. Да и 2 варианта сразу не проверишь.
2
Эксперт .NET
17793 / 12944 / 3381
Регистрация: 17.09.2011
Сообщений: 21,226
25.06.2018, 10:37 8
Цитата Сообщение от Rius Посмотреть сообщение
Нет у него доступа, походу.
Мде, это называется "смотрю в книгу — вижу фигу"
Написано же в первом сообщении:
Цитата Сообщение от V0fka Посмотреть сообщение
Как-то обработать строку, прежде чем она попадет туда я не могу
На пенсию мне пора...

Ну тогда остается либо действительно изменять культуру потока, либо ловить исключение и выводить сообщение об ошибке. Опционально в сообщении об ошибке можно указать "правильный" формат, взяв любое десятичное число и сконвертировать его в строку с учетом текущей культуры.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
25.06.2018, 12:51 9
реально эта фича c# очень-очень бесит, да что там таить, куда не посмотри он везде такой какой-то не до
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 13:55 10
Цитата Сообщение от Evgen1337 Посмотреть сообщение
реально эта фича c# очень-очень бесит, да что там таить, куда не посмотри он везде такой какой-то не до
Вы просто не умеете её готовить. Фича полезная, когда используешь более, чем 1 язык (свой).
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
25.06.2018, 13:58 11
Rius, нет, не согласен
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 14:10 12
Значит, вам ещё не приходилось писать софт для разных языков.
А согласен или нет - не важно. Фичу делали не от балды, а с определённой целью, для поддержки мультикультурности.
И это фича библиотеки, а не самого языка.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
25.06.2018, 14:19 13
Rius, ) первый язык который действительно понял это был ассемблер z80 + потом с тем же успехом x86 + потом всякие java, php, javascript... с общим стажем больше 20лет ) - и для себя я выбираю javascript, и поэтому я говорю, что c# криволапая поделка, и это мое ИМХО, я не согласен
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 14:21 14
Evgen1337, что вы там выбираете, это ваши проблемы. Состояние разработки на JS хорошо показывает статья Каково оно учить JavaScript в 2016
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
25.06.2018, 14:24 15
Rius, на дворе 18 год, живите дальше в далеком прошлом... и ваши проблемы тоже никого не бум бум...
0
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,964
25.06.2018, 14:32 16
На каком-то DotNext-е Дмитрий Сошников упоминал о том, что "backend разработка на js - для извращенцев".
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 14:41 17
2018? Ещё больше всего вот этого костыльного , и каждое лучше и правильнее предыдущего !)
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
25.06.2018, 14:46 18
Rius, костыльного в 2018 году, ай да молодец, в этом сниппете весь c#
C#
1
2
3
4
5
6
7
static readonly CultureInfo ru = CultureInfo.GetCultureInfo("ru-RU");
bool TryParse(string input, out double result)
{
    var @decimal = NumberStyles.AllowDecimalPoint | NumberStyles.AllowLeadingSign | NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite;
    return double.TryParse(input, @decimal, CultureInfo.InvariantCulture, out result) ||
        double.TryParse(input, @decimal, ru, out result);
}
0
Эксперт .NET
11167 / 7091 / 1584
Регистрация: 25.05.2015
Сообщений: 21,446
Записей в блоге: 14
25.06.2018, 14:49 19
Вас никто не заставляет понимать, для чего это, раз сами не осиливаете.
0
249 / 162 / 68
Регистрация: 10.12.2017
Сообщений: 558
25.06.2018, 14:58 20
Rius, короче на и по
0
25.06.2018, 14:58
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.06.2018, 14:58
Помогаю со студенческими работами здесь

как заставить PWS[win98] обрабатывать asp???
вообщем, субж. поставил PWS. взял пример из книги по асп. сделал на хоме директории execute. ничего...

Как заставить обработчик KeyDown обрабатывать клавиши Up и Down?
Мне нужно, чтобы контрол обрабатывал клавиши &quot;стрелка вверх&quot; и &quot;стрелка вниз&quot;. Вместо этого, когда...

Как заставить GPU обрабатывать видео вместо CPU?
Не знаю, куда нужно было поместить эту тему, но проблема следующая: При просмотре некоторых 4k...

Как заставить html-страницы обрабатывать PHP код?
Здравствуйте, я столкнулся с такой проблемой, мне нужно чтобы html-страницы обрабатывали PHP код,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Книги и учебные ресурсы по C#
InfoMaster 08.01.2025
Базовые учебники и руководства Одной из лучших книг для начинающих является "C# 10 и . NET 6 для начинающих" Эндрю Троелсена и Филиппа Джепикса . Книга последовательно раскрывает основные концепции. . .
Что такое NullReferenceEx­­­ception и как исправить?
InfoMaster 08.01.2025
NullReferenceException - одно из самых распространенных исключений, с которым сталкиваются разработчики на C#. Это исключение возникает при попытке обратиться к членам объекта (методам, свойствам или. . .
Что такое Null Pointer Exception (NPE) и как это исправить?
InfoMaster 08.01.2025
Null Pointer Exception (NPE) - это одно из самых распространенных исключений в Java, которое возникает при попытке использовать ссылку на объект, значение которой равно null. Это исключение относится. . .
Русский язык в консоли C++
InfoMaster 08.01.2025
При разработке программ на C++ одной из частых проблем, с которой сталкиваются русскоязычные программисты, является корректное отображение кириллицы в консольных приложениях. Эта проблема особенно. . .
Telegram бот на C#
InfoMaster 08.01.2025
Разработка ботов для Telegram стала неотъемлемой частью современной экосистемы мессенджеров. C# предоставляет мощный и удобный инструментарий для создания разнообразных ботов, от простых. . .
Использование GraphQL в Go (Golang)
InfoMaster 08.01.2025
Go (Golang) является одним из наиболее популярных языков программирования, используемых для создания высокопроизводительных серверных приложений. Его архитектурные особенности и встроенные. . .
Что лучше использовать при создании класса в Java: сеттеры или конструктор?
Alexander-7 08.01.2025
Вопрос подробнее: На вопрос: «Когда одновременно создаются конструктор и сеттеры в классе – это нормально?» куратор уточнил: «Ваш класс может вообще не иметь сеттеров, а только конструктор и геттеры. . .
Как работать с GraphQL на TypeScript
InfoMaster 08.01.2025
Введение в GraphQL и TypeScript В современной разработке веб-приложений GraphQL стал мощным инструментом для создания гибких и эффективных API. В сочетании с TypeScript, эта технология. . .
Счётчик на базе сумматоров + регистров и генератора сигналов согласования.
Hrethgir 07.01.2025
Создан с целью проверки скорости асинхронной логики: ранее описанного сумматора и предополагаемых fast регистров. Регистры созданы на базе ранее описанного, предполагаемого fast триггера. То-есть. . .
Как перейти с Options API на Composition API в Vue.js
BasicMan 06.01.2025
Почему переход на Composition API актуален В мире современной веб-разработки фреймворк Vue. js продолжает эволюционировать, предлагая разработчикам все более совершенные инструменты для создания. . .
Архитектура современных процессоров
inter-admin 06.01.2025
Процессор (центральный процессор, ЦП) является основным вычислительным устройством компьютера, которое выполняет обработку данных и управляет работой всех остальных компонентов системы. Архитектура. . .
История создания реляционной модели баз данных, правила Кодда
Programming 06.01.2025
Предпосылки создания реляционной модели В конце 1960-х годов компьютерная индустрия столкнулась с серьезными проблемами в области управления данными. Существовавшие на тот момент модели данных -. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru