|
24.09.2009, 21:13
|
#16
|
Злобный Админ
Регистрация: 04.09.2005
Сообщений: 5,926
Написано 3,415 полезных сообщений (для 9,330 пользователей)
|
Ответ: Проверка: является ли строка числом?
Только в великом и могучем С++ нету...
__________________
|
(Offline)
|
|
24.09.2009, 21:44
|
#17
|
AnyKey`щик
Регистрация: 05.09.2008
Адрес: Пушкино
Сообщений: 14
Написано 7 полезных сообщений (для 15 пользователей)
|
Ответ: Проверка: является ли строка числом?
bool isdigit(char *Num){ double Res=atof(Num); if(Res!=0){ return true; }else if(stricmp(Num, "0")==0){ return true; }
return false; }
Родил... Вроде как работает) Но, блин:
23.2gh465E-1 - число
23.2465E-1 - число
sdgf23.2465E-1 - не число
т.е если первый символ - число, то и вся строка числом считается. Иначе - нет. Вотъ.
Только если в ручную парсить строку, тогда и будет понятно. со sscanf - то же самое.... Щас ещё подумаю.
// Сорри, блин, щас тока тему прочитал... Это уже обсуждалось)))))
// Да, и ещё - из пыха выдрать трудно будет. Там 5-6 (особо не вникал) функций по 200-300 строк кода... И каждую переписывать О_о
// В чистом виде нету... Есть в boost::lexical_cast. Го в гугл)
// Спасибо OreZ за подсказку)
__________________
|
(Offline)
|
|
24.09.2009, 21:47
|
#18
|
Дэвелопер
Регистрация: 14.02.2007
Сообщений: 1,471
Написано 824 полезных сообщений (для 2,920 пользователей)
|
Ответ: Проверка: является ли строка числом?
Сказано же было - все эти функции работают пока не встретят левый символ, поэтмоу в первом случае на выходе "23.2", что есть число как бэ. В данном конкретном случае - ручной парсинг всей строки и проверка каждого символа. Если все символы до '\0' прошли проверку - это число.
|
(Offline)
|
|
24.09.2009, 22:12
|
#19
|
AnyKey`щик
Регистрация: 05.09.2008
Адрес: Пушкино
Сообщений: 14
Написано 7 полезных сообщений (для 15 пользователей)
|
Ответ: Проверка: является ли строка числом?
Да-да, меня Фантом попросил функцию из пыха выдрать) Но когда я увидел, что придётся делать - что-то мне перехотелось) Вот, нашёл в сети - функция разбора действительных чисел на чистом C++ попробуй...
__________________
|
(Offline)
|
|
Эти 2 пользователя(ей) сказали Спасибо zombiee за это полезное сообщение:
|
|
25.09.2009, 01:16
|
#20
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
Чот жесть, мне кажется - у меня компактнее это происходило.
Всем спасибо, подождём ещё)
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.09.2009, 01:34
|
#21
|
AnyKey`щик
Регистрация: 05.09.2008
Адрес: Пушкино
Сообщений: 14
Написано 7 полезных сообщений (для 15 пользователей)
|
Ответ: Проверка: является ли строка числом?
Импер, что ты собираешься ждать?) Тебе же дали готовый пример) Переписывай под себя и всё.
__________________
|
(Offline)
|
|
10.10.2009, 03:29
|
#22
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
Уж дедлайн близится, а реализации всё нет.
Взял и набросал следующее:
bool Check(char *s,int LEN){
enum SymbolIs{DIGIT,EXP,SEP,SIGN,ETC};
SymbolIs Key;
int i;
int Epos=-1;
int Spos=-1;
bool ExitFlg=true;
for(i=0;i<LEN && ExitFlg;i++){
if(s[i]>='0' && s[i]<='9'){
Key=DIGIT;
}
else if(s[i]=='E' || s[i]=='e'){
Key=EXP;
}
else if(s[i]=='.' || s[i]==','){
Key=SEP;
}
else if(s[i]=='+' || s[i]=='-'){
Key=SIGN;
}
else{
Key=ETC;
}
switch(Key){
case DIGIT:{
break;
}
case EXP:{
if(Epos!=-1){
ExitFlg=false;
break;
}
Epos=i;
break;
}
case SEP:{
if(Spos!=-1){
ExitFlg=false;
break;
}
Spos=i;
break;
}
case SIGN:{
if(i==0 || Epos==i-1){
break;
}
ExitFlg=false;
break;
}
case ETC:{
ExitFlg=false;
break;
}
}
}
return ExitFlg;
}
Прогоним на тестах:
Тест SBJoker
Тест impersonalis
Тест Phantom
Тест zombiee
"23.2gh465E-1" 0 "23.2465E-1"1 "sdgf23.2465E-1"0
|
Тест impersonalis2
"1+1" 0 "+.12E-008"1 "+.12E-008.1"0
|
Предлагаю собравшимся отписатсья (особенное если видят ошибки).
Функция, конечно позволяет вводить фантастические занчения мантиссы и показателя, но это вполне удовлетворяет моему ТЗ.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
10.10.2009, 18:26
|
#23
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
09.10.2010, 23:32
|
#24
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
Кстати, по данному запросу в яндексе лидирует некий топик "Как лучше проверить, является ли строка числом?" ( http://coder007.livejournal.com/568.html). Автор кторого отключил анонимные комменты. Так что рассмотрим его код здесь:
private static boolean checkBySteps(String string) {
if (string == null || string.length() == 0) return false;
int i = 0;
if (string.charAt(0) == '-') i = 1;
for (; i < string.length(); i++) {
final char c = string.charAt(i);
if (!(c >= '0' && c <= '9')) {
return false;
}
}
return true;
}
Ну, во-первых, отцензуернный коммент ДядиДимы:
<<jimon>> (22:54:44 6/10/2010)
сишарпист думает о скорости ? нет пути
|
А во-вторых - мои "пять копеек" (сравнивая с кодом из поста #22).
Данный парсер не может корреткно отреагировать даже на "+1". Он реагирует только на целые числа, в записи которых отсутсвует десятичная степень (12Е3).
Ну это если кто будет лабы делать..
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
09.10.2010, 23:59
|
#25
|
Бывалый
Регистрация: 03.12.2008
Адрес: наша раша
Сообщений: 762
Написано 129 полезных сообщений (для 245 пользователей)
|
Ответ: Проверка: является ли строка числом?
Сообщение от impersonalis
Требуется сабжевая фунЕция:
необходимо проверить - можно ли содержащийся в переданном указателе на начало нуль-терминированной строки текст интерпретировать как число, в соответствии со всякими там RFC. Не хочу изобретать велик. Но если грамотных реализаций нет - то могу и обойтись)
|
Блин, Ты по русски то нормально говори. Не в переданном указателе, а в переданном указателеМ ... ....текстЕ...
Тьфу ... вообще запутался... Текст , как таковой не содержится в указателе!!!
Надо было спросить так: "можно ли текст строки, которая передается через указатель..."
А то я блин ломаю голову!!! А С++ - очень точный язык.
ЗЫ . Проще свою функцию написать и не париться. Это и надежней будет!
Еще можно через потоковые классы. iostream. там есть возможность преобразовать из строки - число.
__________________
Reality Simulation Games
Core 2 Duo 2,8GHz, RAM 1Gb, ATI R5670 1Gb. WinXP 32
|
(Offline)
|
|
10.10.2010, 00:11
|
#26
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
Блин, Ты по русски то нормально говори. Не в переданном указателе, а в переданном указателеМ ... ....текстЕ...
|
Угу - правка изначального варианта исказила смысл.
Изначально (по -русски!) имелось в виду:
текст, содержащийся в нуль-терминированной строке, указатель на которую был передан.
А не "в тексте, переданном указателем на строку". Что некорректно.
ЗЫ . Проще свою функцию написать и не париться. Это и надежней будет!
|
так и сделал - см пост номер 22
там есть возможность преобразовать из строки - число.
|
слабость такого подхода разбирается в теме. Функции трансляции либо игнорируют (обрезают) неинтерпретируемые куски (12ЙЙ=12), либо превращают их в ноль (0), что не явялется недопустимым выходом парсера (для "0"). iostream тут причём?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
10.10.2010, 00:16
|
#27
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
Morganolla харе править свой пост =) Мои ответы теряют актуальность.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
20.10.2010, 13:31
|
#28
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Ответ: Проверка: является ли строка числом?
В своё время не придал значению тому, что пустая строка ("") воспринимается как допустимое значение (подразумевая 0). При тестировании функции (точнее её реализации на Blitz3D) в полевых условиях с применением "эффекта кота" обнаружились (ВНЕЗАПНО?) дополнительные допустимые конструкции, которые уже с натяжкой можно списать на интеллектуальность парсера "строка->число". Исправляется всё просто.
Для проверки используется набор значений impersonalis-F1( FAIL-1):
Функция:
bool Check(char *s,int LEN){
enum SymbolIs{DIGIT,EXP,SEP,SIGN,ETC};
SymbolIs Key;
int i;
int Epos=-1;
int Spos=-1;
bool ExitFlg=true;
bool IsClose=false;
for(i=0;i<LEN && ExitFlg;i++){
if(s[i]>='0' && s[i]<='9'){
Key=DIGIT;
}
else if(s[i]=='E' || s[i]=='e'){
Key=EXP;
}
else if(s[i]=='.' || s[i]==','){
Key=SEP;
}
else if(s[i]=='+' || s[i]=='-'){
Key=SIGN;
}
else{
Key=ETC;
}
IsClose=false;
switch(Key){
case DIGIT:{
IsClose=true;
break;
}
case EXP:{
if(Epos!=-1){
ExitFlg=false;
break;
}
Epos=i;
break;
}
case SEP:{
if(Spos!=-1){
ExitFlg=false;
break;
}
Spos=i;
break;
}
case SIGN:{
if(i==0 || Epos==i-1){
break;
}
ExitFlg=false;
break;
}
case ETC:{
ExitFlg=false;
break;
}
}
}
if(!IsClose){
ExitFlg=false;
}
return ExitFlg;
}
Если закомментить строку сброса ExitFlg при лжи в IsClose функция вновь не проходит новый тест.
Test "SBJoker"
ололо 0
15445.1 1
Test "impersonalis"
12БЛДЖАД! 0
Test "Phantom"
123.345E-12 1
Test "zombiee"
23.2gh465E-1 0
23.2465E-1 1
sdgf23.2465E-1 0
Test "impersonalis-2"
1+1 0
+.12E-008 1
+.12E-008.1 0
Test "impersonalis-F1"
E 0
0
+ 0
- 0
. 0
Присылайте ваши наборы с аргументацией некорректности работы функции!
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
18.06.2012, 05:41
|
#29
|
Элита
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений (для 1,833 пользователей)
|
Ответ: Проверка: является ли строка числом?
Читал тут спецификацию JSON: http://www.json.org/json-ru.html
Увидел вот эту картинку: http://www.json.org/number.gif
Вспомнил эту тему, решил запостить.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:31.
|