С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
2 / 2 / 0
Регистрация: 02.07.2021
Сообщений: 114
1
RAD XE3+

Решено. Как узнать разделитель дроби в вещественных числах

08.11.2023, 05:32. Показов 2023. Ответов 66

Author24 — интернет-сервис помощи студентам
Win7-64
Delphi 10.3
При обработке строки в число StrToFloat у меня возникала ошибка, проблема старая, это точка или запятая, смотря какая настройка. В старых версиях до XE6, это решалось глобальной переменной DecimalSeparator, но потом ее убрали. Есть предложения в тырнете ставить принудительно разделитель, но оказывается, через час-два настройки слетали на умолчание, так что нужно только чтение. Свежее решение от 2023 года было нагуглено. Сейчас все конвертится нормально.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
Function CheckString (S: string): string; // Проверяем Edit поля при ручном вводе
 var
 a: integer;
 SS: char;
 fs: TFormatSettings;
 begin
    fs:=TFormatSettings.Create(GetThreadLocale());
    GetLocaleFormatSettings(GetThreadLocale(),fs);
    SS:= fs.DecimalSeparator; // читаем (точка-запятая) в вещественных числах
  for a:= Length (S) downto 1 do if s[a] in ['.', ',', '0'..'9'] then else Delete (s, a, 1); //удаляем пробелы и прочее
  for a:=1 to Length (S) do if S[a]  in [',', '.'] then S[a] := SS; // ставим правильный разделитель 
  Result:= S;
 end;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.11.2023, 05:32
Ответы с готовыми решениями:

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

Как определить разделитель десятичной дроби (decimal separator) Visual C++ 2008
И сразу ответ: String ^Separator =...

Разделитель в числах с плавающей точкой
Здравствуйте, у меня есть интересный вопрос :) Всем известно, что в переменной типа double могут...

Как заставить выводить точку в вещественных числах?
JavaScript-код требует точки в качестве разделителей дробной и целой частей. Как формат настроить?...

Програмно изменить Регион и разделитель в числах в Windows
Програмно изменить Регион и разделитель в числах в Windows В региональных настройках системы

66
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 06:06 2

Цитата Сообщение от 119zero Посмотреть сообщение
if s[a] in ['.', ',', '0'..'9'] then else Delete...
это что за бред? Да и не только это...
Delphi
1
2
3
4
5
6
7
8
9
function CheckString (s: string): string;
var  d: double;
begin
  with TFormatSettings.Create do begin
    result := StringReplace(s, '.', DecimalSeparator, [rfReplaceAll]);
    result := StringReplace(result, ',', DecimalSeparator, [rfReplaceAll]);
  end;
  if not TryStrToFloat(result, d) then result := 'нифига не число';
end;;
0
2 / 2 / 0
Регистрация: 02.07.2021
Сообщений: 114
08.11.2023, 06:43  [ТС] 3
Цитата Сообщение от D1973 Посмотреть сообщение
за бред?
Чистим мусор, in вообще самая удобная, а then else чем не нравится ?

Цитата Сообщение от D1973 Посмотреть сообщение
TryStrToFloat
Народ в тырнете жалуется, что не работает эта фигня. Да и вообще инфа по этой теме разделителя в основном старая, я уже все перекопал
0
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 06:52 4
Цитата Сообщение от 119zero Посмотреть сообщение
Чистим мусор
т.е. тот факт, что из фразы, как на скрине, мы получаем кошерное действительное число - Вас не смущает? Не слишком ли Вы чисткой увлеклись?

Название: Снимок.PNG
Просмотров: 122

Размер: 1.5 Кб

Цитата Сообщение от 119zero Посмотреть сообщение
Народ в тырнете жалуется, что не работает эта фигня.
т.е. и я и еще 99% Delphi-разработчиков этим пользуются и даже и не знают, что, по мнению Васи Пупкина, "эта фигня не работает"?
Цитата Сообщение от 119zero Посмотреть сообщение
инфа по этой теме разделителя в основном старая
А какая "инфа" Вам нужна? Ничего нового со времен Delphi 3, как бы, не придумали за исключением мелких усовершенствований...
1
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 06:56 5
Цитата Сообщение от 119zero Посмотреть сообщение
а then else чем не нравится
какие действия должны произойти, если символ попадет в множество? Если никаких - зачем нужна эта секция? Надо условие переделать, чтобы без нее обойтись.
0
2 / 2 / 0
Регистрация: 02.07.2021
Сообщений: 114
08.11.2023, 07:15  [ТС] 6
Цитата Сообщение от D1973 Посмотреть сообщение
"эта фигня не работает"?
На оверклокере говорили, где-то еще, много всего читал сегодня
Цитата Сообщение от D1973 Посмотреть сообщение
Не слишком ли Вы чисткой увлеклись?
Всякое бывает, можно и отключить.
Цитата Сообщение от D1973 Посмотреть сообщение
Ничего нового со времен Delphi 3, как бы, не придумали
Например DecimalSeparator переименовали в другое имя и переместили в SysUtils, потом и там удалили.
Цитата Сообщение от D1973 Посмотреть сообщение
какие действия должны произойти, если символ попадет в множество?
Это стиль написания такой, экономит минимум 1 слово, об этом редко упоминают в книгах.
0
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 07:18 7
Цитата Сообщение от 119zero Посмотреть сообщение
Это стиль написания такой, экономит минимум 1 слово
я вам подскажу как еще одну букву сэкономить: используйте not и секцию else можно вообще не писать - экономия!

Добавлено через 43 секунды
Цитата Сообщение от 119zero Посмотреть сообщение
об этом редко упоминают в книгах.
правильно не упоминают, потому как чушь.
0
2 / 2 / 0
Регистрация: 02.07.2021
Сообщений: 114
08.11.2023, 07:26  [ТС] 8
Цитата Сообщение от D1973 Посмотреть сообщение
not и секцию else
Специально сейчас проверил - not не работает, дает ошибку. Еще и else, я же сказал, что экономия есть.
Цитата Сообщение от D1973 Посмотреть сообщение
чушь.
Неа, наоборот, это фишка такая
0
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 07:48 9
Цитата Сообщение от 119zero Посмотреть сообщение
Специально сейчас проверил - not не работает, дает ошибку.
Решено. Как узнать разделитель дроби в вещественных числах


Что я делаю не так? Почему у меня работает?

Не по теме:

Хотя что я Вас убеждаю? Делайте что хотите, мне-то какая вообще разница?

0
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,989
08.11.2023, 09:08 10
Цитата Сообщение от 119zero Посмотреть сообщение
TryStrToFloat
Народ в тырнете жалуется, что не работает эта фигня.
Работает. Просто не нужно вводить всякий мусор вместо чисел. Я ещё понимаю, можно убрать пробелы спереди и сзади функцией Trim(). А остальное убирать не нужно.

Цитата Сообщение от D1973 Посмотреть сообщение
Что я делаю не так? Почему у меня работает?
В отличие от ТС, ты выражение после not поместил в скобки.
0
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 09:35 11
Цитата Сообщение от AzAtom Посмотреть сообщение
ты выражение после not поместил в скобки
А он разве нет? Ты, наверное, поближе к нему сидишь, видишь, а мне со своего места и не разглядеть...
1
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
08.11.2023, 09:51 12
Цитата Сообщение от 119zero Посмотреть сообщение
Это стиль написания такой
Это не стиль написания, это языковая безграмотность.
Цитата Сообщение от 119zero Посмотреть сообщение
об этом редко упоминают в книгах.
Логично. Экономия символов в тексте программы при помощи таких приемов - это треш.
0
Модератор
3756 / 2260 / 782
Регистрация: 15.11.2015
Сообщений: 8,989
08.11.2023, 10:11 13
Цитата Сообщение от D1973 Посмотреть сообщение
я вам подскажу как еще одну букву сэкономить
Кстати, если считать и скобки, то даже больше на 1 символ.
Delphi
1
2
  for a:= Length (S) downto 1 do if s[a] in ['.', ',', '0'..'9'] then else Delete (s, a, 1); //удаляем пробелы и прочее
  for a:= Length (S) downto 1 do if not (s[a] in ['.', ',', '0'..'9']) then Delete (s, a, 1); //удаляем пробелы и прочее
1
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
08.11.2023, 10:27 14
Delphi
1
2
3
4
5
6
7
8
9
10
function TryStrToDoubleEx(const S: string; out Value: Double): Boolean;
begin
  // перевод строки в double c премодерацией разделителя.
  var temp:= S;
  for var idx:= 1 to length(temp) do
    if CharInSet(temp[idx], ['.', ','])
      then temp[idx]:= FormatSettings.DecimalSeparator;
 
  result:= TryStrToFloat(temp, Value);
end;
1
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 11:10 15
Цитата Сообщение от AzAtom Посмотреть сообщение
то даже больше на 1 символ
никакой экономии
0
237 / 203 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
08.11.2023, 11:18 16
Цитата Сообщение от AzAtom Посмотреть сообщение
Кстати, если считать и скобки, то даже больше на 1 символ.
Цитата Сообщение от D1973 Посмотреть сообщение
никакой экономии
Господа, вас что - штрафуют за использовании лишних байт на дисковом пространстве?
0
Модератор
9624 / 6236 / 2421
Регистрация: 21.01.2014
Сообщений: 26,626
Записей в блоге: 3
08.11.2023, 11:22 17
Цитата Сообщение от Constcat Посмотреть сообщение
вас что - штрафуют
да это так, стёб по мотивам
Цитата Сообщение от 119zero Посмотреть сообщение
Это стиль написания такой, экономит минимум 1 слово
1
Злостный нарушитель
9592 / 5188 / 1182
Регистрация: 12.03.2015
Сообщений: 24,492
08.11.2023, 12:56 18
Цитата Сообщение от Constcat Посмотреть сообщение
Господа, вас что - штрафуют за использовании лишних байт на дисковом пространстве?
Электрошоком долбят и лишают премии.
0
2 / 2 / 0
Регистрация: 02.07.2021
Сообщений: 114
10.11.2023, 22:50  [ТС] 19
Цитата Сообщение от AzAtom Посмотреть сообщение
можно убрать пробелы спереди и сзади функцией Trim(). А остальное убирать не нужно.
Угу, набираешь число в Edit и запросто пробел в середину втыкаеш, лихко. И еще, у буржуев прочитал, что разделителем может быть вообще @, все вопросы к ним по этой теме.
Цитата Сообщение от Constcat Посмотреть сообщение
Это не стиль написания, это языковая безграмотность
Дык я в книге об этом и прочитал, попробовал, реально код меньше, мне понравилось
Цитата Сообщение от Verevkin Посмотреть сообщение
result:= TryStrToFloat(temp, Value);
Ну и дальше? Потом проверять в мейне, код растет, любой TryStrToFloat требует проверки.
Цитата Сообщение от Verevkin Посмотреть сообщение
then temp[idx]:= FormatSettings.DecimalSeparator;
Где инициализация ?
Цитата Сообщение от D1973 Посмотреть сообщение
ты выражение после not поместил в скобки
А он разве нет?
И в скобки и без, D10.3 не понимает, я прямо скопировал твой код, пишет ошибку


Теперь короче, 4 строки

Delphi
1
2
3
4
5
6
7
8
9
10
Function CheckString (S: string): string; // Проверяем Edit поля
 var
 a: integer;
 fs: TFormatSettings;
 begin
      fs:=TFormatSettings.Create (GetThreadLocale());
    GetLocaleFormatSettings (GetThreadLocale(),fs);
    for a:= Length (S) downto 1 do if s[a] in ['.' ,  ','] then S[a] := fs.DecimalSeparator  else   if S[a] in ['0'..'9'] then else Delete (s, a, 1);
    Result:= S; // Проверил, все работает четко
 end;
Миниатюры
Решено. Как узнать разделитель дроби в вещественных числах  
0
13 / 11 / 2
Регистрация: 11.10.2023
Сообщений: 138
10.11.2023, 22:59 20
Охренеть! 10.3 на Хрюше работает???
0
10.11.2023, 22:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.11.2023, 22:59
Помогаю со студенческими работами здесь

Как узнать разделитель в файловой системе?
Отака фигня: public static String slash() { String s = ""; File f = new...

(Решено) Как я могу узнать размер экрана в пикселях?
(Решено) День добрый. Возникла необходимость получить размер экрана в пикселях. Подскажите...

Точка и запятая в вещественных числах
Такие непонятки с точкой и запятой : sprintf(dest, "%0*.*f", 8, 4, 2.5 ); ...

Ошибки из-за погрешности в вещественных числах
Здравствуйте. Пытаюсь написать 3Д движок. Вроде все было замечательно, но появилась проблема: я...

Как сменить системные параметры: десятичный разделитель и разделитель в дате?
Как сменить системные параметры: 'десятичный разделитель' и 'разделитель в дате'? Подозреваю,...

Найти значение модуля |ax-b| при заданных a, b - вещественных числах
Нахождение значения модуля |ax-b| при заданных a, b - вещественных числах. Помогите написать код...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru