Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Ср Июл 18 2007 23:47 Заголовок сообщения: Плавующую запятую в плавающую точку [C++] |
|
|
При конвертации действительного числа в строку плавающая точка определяется символом, указанным в региональных настройках Windows (например, запятой). Как мне перевести число в строку, чтобы плавающая точка была именно точкой, а не черти чем? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Dimasm
Зарегистрирован: 25.04.2005 Сообщения: 454
|
Добавлено: Чт Июл 19 2007 08:22 Заголовок сообщения: |
|
|
ага, а ещё пользователи любят разделять дробную часть с помощью тире, дробной черты, пробела...
я борюсь с этии так...
Код: | //заменяет запятую на точку
String StrDelComma(String line)
{
if(line.AnsiPos(",")>0)
line[line.AnsiPos(",")]='.';
return line;
};
|
_________________ С уважением Dimasm |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пт Июл 20 2007 03:38 Заголовок сообщения: |
|
|
Ну-у-у... Я так тоже могу.
Это работает только в том случае, если плавающая точка обозначается запятой. Мне же надо предусмотреть вероятность любого символа (или даже набора символов). Искать в тексте любые символы, не относящиеся к числам - тоже не выход, так как найдется идиот, у которого плавающая точка обозначается какой-нить цифрой. Мне же нужно точно: вот есть значение типа double (или еще какое из действительных), а вот его конвертируемый в строку вариант (целая часть - точка - дробная часть). Наверняка же есть какая-то функня для этого. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
grf
Зарегистрирован: 05.04.2005 Сообщения: 1242 Откуда: Москва
|
Добавлено: Пт Июл 20 2007 08:31 Заголовок сообщения: |
|
|
Цитата: | Искать в тексте любые символы, не относящиеся к числам - тоже не выход, так как найдется идиот, у которого плавающая точка обозначается какой-нить цифрой. |
Понял что сказал?
174502638
Где у меня тут точка, а? А она есть!
а как компьютер это узнает?
выуживай из винды региональные настройки и ищи нужный символ. хотя то, что не цифра - то запитая более легкий и надежный вариант. Если есть два таких символа, то это не число, а строка, о чем и полезно напомнить пользователю.
![Wink](images/smiles/icon_wink.gif) _________________ Errare humanum est |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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 |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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. Только вот точка должна быть точкой, а не чем-то есчо. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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](images/smiles/icon_eek.gif) _________________ С уважением Dimasm |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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 символ, обозначающий плавующую точку.
Самое интересное то, что компьютер-то знает, где она "сидит".
Единственным вариантом решения задачи я вижу использование функций, отсекающих целую или дробную часть, после чего эти две части конвертируются в строку, разделяются ".", и к всему этому добавляется обозначение ед. изм. Но, может быть, есть какая-нить функция конвертации числа в строку, где можно указать, каким символом отобразить точку? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
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 |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Июл 23 2007 03:57 Заголовок сообщения: |
|
|
Это-то все понятно. Но, опять же, "на всякого мудреца довольно простоты"! Защита "от дурака" на то и придумана, что программа попадет в руки идиоту. И указать в качестве разделителя цифру - это еще ничего. Но найдется тот, кто не от мира сего запихнет в региональные настройки целое число (порядков эдак в 5 - 10).
Предусмотреть надо все. Увы, но это правда жизни. И не раз с таким делом сталкивался. Неужели нет возможности перевода числа в строку, без использования региональных настроек?! (Насчет "напишите такую функцию сами" я уже понял.) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Июл 23 2007 05:05 Заголовок сообщения: |
|
|
Друзья, это снова я! Как говорится, "б...я буду - извиняться пришел!"
Дело в том, что я тут поднял такие дебаты, вместо того, чтобы во всем самому конкретненько разобраться. Тут, оказывается, фишка такая... Хрен укажешь в региональных настройках разделитель, содержащий цифру. То есть цифры являются недопустимыми символами при указании разделителя целой и дробной части. Поэтому, я думаю, вопрос исчерпан, т.к. на него уже был дан ответ ранее. Приношу свои публичные извинения! ![Wink](images/smiles/icon_wink.gif) |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Пн Июл 23 2007 07:57 Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] |
|
|
Mytilus Galloprovincialis писал(а): | При конвертации действительного числа в строку плавающая точка определяется символом, указанным в региональных настройках Windows (например, запятой). Как мне перевести число в строку, чтобы плавающая точка была именно точкой, а не черти чем? |
А что? Старый, добрый printf (wsprintf -- для строки в виндах) перестал работать?
-------------------------------------
чем больше си приближается к яве, тем более идиотскими становятся программы |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Пн Июл 23 2007 23:47 Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] |
|
|
критикан писал(а): | А что? Старый, добрый printf (wsprintf -- для строки в виндах) перестал работать? |
Да мне это надо не для вывода на экран. Просто прога должна генерить скрипт и запихивать туда числа, используя, естессна, точку. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
vir
Зарегистрирован: 17.05.2007 Сообщения: 24
|
Добавлено: Ср Июл 25 2007 12:06 Заголовок сообщения: |
|
|
Насколько я представляю себе правильный ответ, он заключается в том, чтоб установить стандартные настройки локализации (en_us, C, POSIX или что-то вроде того), конвертировать в строку, и установить обратно настройки локализации. И кстати sprintf действительно никто не отменял. |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Ср Июл 25 2007 16:25 Заголовок сообщения: Re: Плавующую запятую в плавающую точку [C++] |
|
|
Mytilus Galloprovincialis писал(а): | Да мне это надо не для вывода на экран. Просто прога должна генерить скрипт и запихивать туда числа, используя, естессна, точку. |
так я о том и говорю. и vir подтверждает sprintf/wsprintf заносит инфу в строку, а дальше пихай ея куды хошь -- хошь в скрипт, хошь в вошь
---------------------------------
что такое ява? это сигареты и мотоцикл и времён СССР, но никак не ЯП |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
Mytilus Galloprovincialis
Зарегистрирован: 30.08.2005 Сообщения: 358 Откуда: откуда все люди родятся
|
Добавлено: Ср Июл 25 2007 23:21 Заголовок сообщения: |
|
|
А sprintf/wsprintf всегда точку рисует? Вне зависимости от настроек ОС? |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
критикан
Зарегистрирован: 18.02.2005 Сообщения: 247
|
Добавлено: Чт Июл 26 2007 07:57 Заголовок сообщения: языки программирования приходят и уходят, а Си остаётся |
|
|
полагаю, что всегда. во всяком случае, в справке по wsprintf нет упоминания зависимости от настроек ОС
-------------------------------
языки программирования приходят и уходят, а Си остаётся |
|
Вернуться к началу |
|
![](templates/subSilver/images/spacer.gif) |
|