Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

Плавующую запятую в плавающую точку [C++]

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Ср Июл 18 2007 23:47    Заголовок сообщения: Плавующую запятую в плавающую точку [C++] Ответить с цитатой

При конвертации действительного числа в строку плавающая точка определяется символом, указанным в региональных настройках Windows (например, запятой). Как мне перевести число в строку, чтобы плавающая точка была именно точкой, а не черти чем?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Dimasm



Зарегистрирован: 25.04.2005
Сообщения: 454

СообщениеДобавлено: Чт Июл 19 2007 08:22    Заголовок сообщения: Ответить с цитатой

ага, а ещё пользователи любят разделять дробную часть с помощью тире, дробной черты, пробела...
я борюсь с этии так...
Код:
//заменяет запятую на точку
String StrDelComma(String line)
{
    if(line.AnsiPos(",")>0)
        line[line.AnsiPos(",")]='.';
    return line;
};

_________________
С уважением Dimasm
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пт Июл 20 2007 03:38    Заголовок сообщения: Ответить с цитатой

Ну-у-у... Я так тоже могу.
Это работает только в том случае, если плавающая точка обозначается запятой. Мне же надо предусмотреть вероятность любого символа (или даже набора символов). Искать в тексте любые символы, не относящиеся к числам - тоже не выход, так как найдется идиот, у которого плавающая точка обозначается какой-нить цифрой. Мне же нужно точно: вот есть значение типа double (или еще какое из действительных), а вот его конвертируемый в строку вариант (целая часть - точка - дробная часть). Наверняка же есть какая-то функня для этого.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
grf



Зарегистрирован: 05.04.2005
Сообщения: 1242
Откуда: Москва

СообщениеДобавлено: Пт Июл 20 2007 08:31    Заголовок сообщения: Ответить с цитатой

Цитата:
Искать в тексте любые символы, не относящиеся к числам - тоже не выход, так как найдется идиот, у которого плавающая точка обозначается какой-нить цифрой.



Понял что сказал?

174502638

Где у меня тут точка, а? А она есть!

а как компьютер это узнает?

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

Wink
_________________
Errare humanum est
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Dimasm



Зарегистрирован: 25.04.2005
Сообщения: 454

СообщениеДобавлено: Пт Июл 20 2007 08:38    Заголовок сообщения: Ответить с цитатой

Код:
void __fastcall TFormMainForm::EditNameKeyPress(TObject *Sender, char &Key)
{
if( Key != '0' &&
    Key != '1' &&
    Key != '2' &&
    Key != '3' &&
    Key != '4' &&
    Key != '5' &&
    Key != '6' &&
    Key != '7' &&
    Key != '8' &&
    Key != '9' &&
    Key != '.'  ) Key = NULL;
}

ну и в условие впихнуть, чтоб пропускалисть
клавиши Enter, breakspace,delete...
Ну а что на данной машие разделитель(точка или запятая)
надо либо в настройках программы, либо из региональных настроек
_________________
С уважением Dimasm
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Сб Июл 21 2007 01:17    Заголовок сообщения: Ответить с цитатой

grf писал(а):
174502638

Где у меня тут точка, а? А она есть!


Одно дело, как ты видишь представление числа, другое дело - как его воспринимает компьютер. Он-то знает, что среди 174502638 есть точка.

2 Dimasm: Вот ты замудрил! Не забывай, что символы - это, по сути, числа (ANSI или какие другие). И выискивать их легче диапазоном, нежели перебором ( >= '0' && <= '9'). Проблема в том, что пользователь не вводит действительное число в какой-нить Edit.
Проблема такова: есть класс с двумя свойствами. Одно - double, другое - enum. Перечисление содержит значения единиц измерения. Короче говоря, класс создан для того, чтобы хранить размер и единицу измерения, в которой указывается этот размер (например, миллиметры или дюймы). Осталось только реализовать метод, возвращающий массив char - типа 10px, 812mm или, допустим 11.8pt. Только вот точка должна быть точкой, а не чем-то есчо.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Dimasm



Зарегистрирован: 25.04.2005
Сообщения: 454

СообщениеДобавлено: Сб Июл 21 2007 23:30    Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] Ответить с цитатой

Mytilus Galloprovincialis писал(а):
При конвертации действительного числа в строку плавающая точка определяется символом, указанным в региональных настройках Windows (например, запятой). Как мне перевести число в строку, чтобы плавающая точка была именно точкой, а не черти чем?


Mytilus Galloprovincialis писал(а):
Ну-у-у... Я так тоже могу.
Это работает только в том случае, если плавающая точка обозначается запятой. Мне же надо предусмотреть вероятность любого символа (или даже набора символов). Искать в тексте любые символы, не относящиеся к числам - тоже не выход, так как найдется идиот, у которого плавающая точка обозначается какой-нить цифрой. Мне же нужно точно: вот есть значение типа double (или еще какое из действительных), а вот его конвертируемый в строку вариант (целая часть - точка - дробная часть). Наверняка же есть какая-то функня для этого.


Mytilus Galloprovincialis писал(а):
Проблема такова: есть класс с двумя свойствами. Одно - double, другое - enum. Перечисление содержит значения единиц измерения. Короче говоря, класс создан для того, чтобы хранить размер и единицу измерения, в которой указывается этот размер (например, миллиметры или дюймы). Осталось только реализовать метод, возвращающий массив char - типа 10px, 812mm или, допустим 11.8pt. Только вот точка должна быть точкой, а не чем-то есчо.

Я что-то запутался...
Если у вас уже есть класс, в котором уже есть число и его еденица измерения, то просто конвертируйте в char и проверяйте, есть там запятая, то заменяете на точку! тут проблемм быть не должно...функция конвертации однозначно поставит только один разделяющий символ, который скорей всего будет либо точкой либо запятой! другим символам выползать неоткуда

Другое дело, когда пользователь вводит данные в ваш класс, для конвертрования char -> double+enum надо разобрать что ввёл пользователь... врядли будет готовая функция для конвертации строки типа "10,3mm"... тут нужно какой-нить алгоритм придумать.. высвечивать подсказки пользователю.. и не пойму каким местом сюда присоеденяется проблемма с точкой Shocked
_________________
С уважением Dimasm
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Вс Июл 22 2007 02:42    Заголовок сообщения: Ответить с цитатой

Значит, разложу все по полочкам. Класс имеет два свойства. Первое свойство называется Unit. Оно перечисление. Вот такое:
Код:
enum TMeterUnit {muCentimeter, muFontSize, muInch, muMillimeter, muPercent, muPica, muPixel, muPoint, muUndefined, muXHeight};

С помощью него, программер выбирает единицу измерения.
Второе свойство (именуется Value) типа double. В нем указывается кол-во этих самых единиц измерения. И наконец, есть в классе метод (называется Text), который возвращает введенные данные в виде текста. Вот пример: указываем в Value 101.01, а в Unit - muPoint. Метод Text, в таком случае вернет строку "101.01pt". Все бы замечательно, но пользователь Windows сам определяет, какой символ будет разделять целую и дробную части числа. Если он указал в качестве разделителя ноль ("0"), то поди отыщи в 101001 символ, обозначающий плавующую точку.
Самое интересное то, что компьютер-то знает, где она "сидит".
Единственным вариантом решения задачи я вижу использование функций, отсекающих целую или дробную часть, после чего эти две части конвертируются в строку, разделяются ".", и к всему этому добавляется обозначение ед. изм. Но, может быть, есть какая-нить функция конвертации числа в строку, где можно указать, каким символом отобразить точку?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Dimasm



Зарегистрирован: 25.04.2005
Сообщения: 454

СообщениеДобавлено: Вс Июл 22 2007 17:51    Заголовок сообщения: Ответить с цитатой

Mytilus Galloprovincialis писал(а):
Если он указал в качестве разделителя ноль ("0"), то поди отыщи в 101001 символ, обозначающий плавующую точку.
Самое интересное то, что компьютер-то знает, где она "сидит".

ИМХО бред, если пользователь указывает в качестве разделителя цифру! в таком случае у меня возникнут вопросы к адекватности пользователя. Всё что угодно кроме цифр!

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

Всё гораздо проще, ничего отсекать не надо
Код:
// узнаём что в системе является разделителем
String Fun1()
{
   String result = ".";// по умолчанию
   String number = FloatToStr(10.10);
   int i = 0;
   while(i++ < number.Lenght())
   {
        if( number[i] != '0' &&
            number[i] != '1' &&
            ...
            number[i] != '9')
        {
            result = number[i];
            break;
        };
    };
    return result;
};

// заменяем системный разделитель, на то
// что принял за разделитель пользователь
// num - дробное число... напрмиер "145.22"
// my_point - то, что принял за разделитель пользователь
// программы, например "-"
String Fun2(float num,String my_point)
{
    // узнаём что за разделитель в системе
   String sys_point = Fun1();
   String str_num = FloatToStr(num);
   if(str_num.AnsiPos(sys_point)>0)
        str_num[str_num.AnsiPos(sys_point)]=my_point;
   return str_nume;
};
// если задать Fun2(144.225,"-"), на выходе получим строку "144-255"

Код на основе библиотеки VCL, у ват будет немного по другому
Дальше приделайте в конце единицу измерения
Mytilus Galloprovincialis писал(а):
Но, может быть, есть какая-нить функция конвертации числа в строку, где можно указать, каким символом отобразить точку?

Напишите её сами
_________________
С уважением Dimasm
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Июл 23 2007 03:57    Заголовок сообщения: Ответить с цитатой

Это-то все понятно. Но, опять же, "на всякого мудреца довольно простоты"! Защита "от дурака" на то и придумана, что программа попадет в руки идиоту. И указать в качестве разделителя цифру - это еще ничего. Но найдется тот, кто не от мира сего запихнет в региональные настройки целое число (порядков эдак в 5 - 10). Confused
Предусмотреть надо все. Увы, но это правда жизни. И не раз с таким делом сталкивался. Неужели нет возможности перевода числа в строку, без использования региональных настроек?! (Насчет "напишите такую функцию сами" я уже понял.)
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Июл 23 2007 05:05    Заголовок сообщения: Ответить с цитатой

Друзья, это снова я! Как говорится, "б...я буду - извиняться пришел!"
Дело в том, что я тут поднял такие дебаты, вместо того, чтобы во всем самому конкретненько разобраться. Тут, оказывается, фишка такая... Хрен укажешь в региональных настройках разделитель, содержащий цифру. То есть цифры являются недопустимыми символами при указании разделителя целой и дробной части. Поэтому, я думаю, вопрос исчерпан, т.к. на него уже был дан ответ ранее. Приношу свои публичные извинения! Wink
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Пн Июл 23 2007 07:57    Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] Ответить с цитатой

Mytilus Galloprovincialis писал(а):
При конвертации действительного числа в строку плавающая точка определяется символом, указанным в региональных настройках Windows (например, запятой). Как мне перевести число в строку, чтобы плавающая точка была именно точкой, а не черти чем?

А что? Старый, добрый printf (wsprintf -- для строки в виндах) перестал работать?
-------------------------------------
чем больше си приближается к яве, тем более идиотскими становятся программы
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Пн Июл 23 2007 23:47    Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] Ответить с цитатой

критикан писал(а):
А что? Старый, добрый printf (wsprintf -- для строки в виндах) перестал работать?

Да мне это надо не для вывода на экран. Просто прога должна генерить скрипт и запихивать туда числа, используя, естессна, точку.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
vir



Зарегистрирован: 17.05.2007
Сообщения: 24

СообщениеДобавлено: Ср Июл 25 2007 12:06    Заголовок сообщения: Ответить с цитатой

Насколько я представляю себе правильный ответ, он заключается в том, чтоб установить стандартные настройки локализации (en_us, C, POSIX или что-то вроде того), конвертировать в строку, и установить обратно настройки локализации. И кстати sprintf действительно никто не отменял.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Ср Июл 25 2007 16:25    Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] Ответить с цитатой

Mytilus Galloprovincialis писал(а):
Да мне это надо не для вывода на экран. Просто прога должна генерить скрипт и запихивать туда числа, используя, естессна, точку.

так я о том и говорю. и vir подтверждает sprintf/wsprintf заносит инфу в строку, а дальше пихай ея куды хошь -- хошь в скрипт, хошь в вошь
---------------------------------
что такое ява? это сигареты и мотоцикл и времён СССР, но никак не ЯП
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Mytilus Galloprovincialis



Зарегистрирован: 30.08.2005
Сообщения: 358
Откуда: откуда все люди родятся

СообщениеДобавлено: Ср Июл 25 2007 23:21    Заголовок сообщения: Ответить с цитатой

А sprintf/wsprintf всегда точку рисует? Вне зависимости от настроек ОС?
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
критикан



Зарегистрирован: 18.02.2005
Сообщения: 247

СообщениеДобавлено: Чт Июл 26 2007 07:57    Заголовок сообщения: языки программирования приходят и уходят, а Си остаётся Ответить с цитатой

полагаю, что всегда. во всяком случае, в справке по wsprintf нет упоминания зависимости от настроек ОС
-------------------------------
языки программирования приходят и уходят, а Си остаётся
Вернуться к началу
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...