В когось є красиве рішення цієї проблеми?
китайцями чи арабами з їх ієрогліфами
Чим запропоноване DalekiyObriy некрасиве? Аргумент "смішно" смішний.
Цитата: Raven від 2008-06-20 11:16:39Чим запропоноване DalekiyObriy некрасиве? Аргумент "смішно" смішний.Бо переналаштування локалі для того, щоб попарсити число з плаваючою точкою - постріл з танка пого горобцю: результат має не завжди естетичний вигляд.
#include <locale.h>int main(void){ int i; for (i=0; i < 1e6; ++i) { setlocale(LC_NUMERIC, "C"); setlocale(LC_NUMERIC, "UK_UA.utf8"); } return 0;}
$ gcc test.c -o test$ time ./test./test 1,35s user 0,03s system 99% cpu 1,385 total
$gcc ttlc.c -o ttlc -O0$ time ./ttlc4.48user 0.00system 0:04.49elapsed 99%CPU
Raven, для чистоти експерименту треба робити так:Код: [Вибрати]$gcc ttlc.c -o ttlc -O0$ time ./ttlc4.48user 0.00system 0:04.49elapsed 99%CPU
#include <locale.h>int main(void){ int i; for (i=0; i < 1e6; ++i) { char* locale,buf[20]; locale=getlocale(LC_NUMERIC); strcpy(buf,locale); setlocale(LC_NUMERIC, "C"); setlocale(LC_NUMERIC, buf); } return 0;}
Код: [Вибрати] char* locale,buf[20]; locale=getlocale(LC_NUMERIC); strcpy(buf,locale);
char* locale,buf[20]; locale=getlocale(LC_NUMERIC); strcpy(buf,locale);
#include <stdio.h>#define __USE_GNU 1#include <locale.h>char *def = "12.3456";intmain (int argc, char **argv){ char *s; char *endp; double d=0.0; locale_t c_locale; // Set default locale setlocale (LC_ALL, ""); if ( argc > 1) s=argv[1]; else s=def; endp=s; printf("String: %s\n", s); // Create "C" locale c_locale = newlocale(LC_ALL_MASK, "C", NULL); if (c_locale == NULL) { puts("Cannot get C locale.\n"); return 1; } // Convert string to double using "C" locale d = strtod_l (s, &endp, c_locale); if (s != endp && *endp == '\0') printf("%s - it's a float with value %.2lf\n", s, d); else { printf("%s - it's not a number.", s); } // Free unused locale freelocale(c_locale);}
#include <stdio.h>intmain (int argc, char **argv){ char *endp; double d; d=1.2; printf("%f\n", d); d=strtod ("1.2", NULL); printf("%f\n", d); d=strtod ("1,2", NULL); printf("%f\n", d);}$ ./test1.2000001072902963.0000001072693248.000000