00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
#include <cstdlib>
00042
#include <cstring>
00043
#include "TypesNumeriques.h"
00044
00045
namespace PLearn {
00046
using namespace std;
00047
00048
00050 const char DIGITsymbols[] =
"0123456789";
00051 const char ALPHAsymbols[] =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
00052 const char *
ORDINALS[] = {
"d",
"nd",
"th",
"st",0};
00053
00055 const char *
eNumericTypeNames(
int a)
00056 {
00057
static char retour[128];
00058
00059
00060
if (a==
NT_NOT_NUMERIC)
00061
return "not numeric";
00062
else {
00063 retour[0]=0;
00064
if (a &
NT_ORDINAL) strcat(retour,
"ordinal ");
00065
if (a &
NT_CARDINAL) strcat(retour,
"cardinal ");
00066
if (a &
NT_CURRENCY) strcat(retour,
"currency ");
00067
if (a &
NT_PREFIXED) strcat(retour,
"prefixe ");
00068
if (a &
NT_SUFFIXED) strcat(retour,
"suffixe ");
00069
if (a &
NT_PERCENT) strcat(retour,
"pourcentage ");
00070
if (a &
NT_RANGE) strcat(retour,
"range ");
00071
if (a &
NT_TIME) strcat(retour,
"temps ");
00072
if (a &
NT_CODE) strcat(retour,
"code ");
00073
if (a &
NT_UNKNOWN_NUMERIC_TYPE) strcat(retour,
" ??? ");
00074
return retour;
00075 }
00076 }
00077
00079 bool containsChar(
const char *s,
const char *symbols)
00080 {
00081
bool found =
false;
00082
int i=0;
00083
while (!found && symbols[i])
00084 {
00085 found = (
bool)strchr(s,symbols[i]);
00086 i++;
00087 }
00088
return found;
00089 }
00090
00091
00093 char *
stringPos(
const char *s,
const char *strings[])
00094 {
00095
char *t = 0;
00096
int i=0;
00097
while (!t && strings[i])
00098 {
00099 t = strstr(s,strings[i]);
00100 i++;
00101 }
00102
return t;
00103 }
00104
00105
00107 bool looksNumeric(
const char *s)
00108 {
00109
return containsChar(s,
DIGITsymbols);
00110 }
00111
00113 bool elementOf(
const char *s,
const char t)
00114 {
00115
return (
bool)strchr(s,t);
00116 }
00117
00119 void compactRepresentationTranslate(
char *t)
00120 {
00121
int d=0;
00122
int s=0;
00123
00124
while (t[s])
00125 {
00126
if (
elementOf(
DIGITsymbols,t[s]))
00127 {
00128 t[d++]=
'n';
00129
00130
do { s++; }
while (t[s] && (
elementOf(
DIGITsymbols,t[s]) || (t[s]==
',')) );
00131 }
00132
else if (
elementOf(
ALPHAsymbols,t[s]))
00133 {
00134
if ( (
stringPos(&t[s],
ORDINALS)==&t[s])
00135 && (t[d-1]==
'n') )
00136 t[d++]=
'o';
00137
else t[d++]=
'a';
00138
00139
do { s++; }
while (t[s] &&
elementOf(
ALPHAsymbols,t[s]));
00140 }
00141
else t[d++]=t[s++];
00142 }
00143 t[d]=0;
00144
00145 }
00146
00148 void compactRepresentationShrinkNum(
char *t)
00149 {
00150
00151
00152
int d=0;
00153
int s=0;
00154
00155
while (t[s])
00156 {
00157
if ( (strstr(&t[s],
"n.n") == &t[s]) &&
00158 (t[s+3]!=
'.') &&
00159 ( (s-1<0) || (t[s-1]!=
'.') )
00160 )
00161 {
00162 t[d++]=
'n';
00163 s+=3;
00164 }
00165
else if ( (strstr(&t[s],
".n") == &t[s]) &&
00166 (t[s+2]!=
'.') &&
00167 ( (s-1<0) || t[s-1]!=
'n'))
00168 {
00169 t[d++]=
'n';
00170 s+=2;
00171 }
00172
else t[d++]=t[s++];
00173 }
00174 t[d]=0;
00175 }
00176
00178 void compactRepresentationRangesAndOrdinals(
char *t)
00179 {
00180
00181
int d=0;
00182
int s=0;
00183
00184
while (t[s])
00185 {
00186
if ( strstr(&t[s],
"n-n") == &t[s])
00187 {
00188 t[d++]=
'r';
00189 s+=3;
00190 }
00191
else if ( strstr(&t[s],
"no") == &t[s])
00192 {
00193 t[d++]=
'o';
00194 s+=2;
00195 }
00196
else t[d++]=t[s++];
00197 }
00198 t[d]=0;
00199 }
00200
00202 void compactRepresentation(
char *t)
00203 {
00204
compactRepresentationTranslate(t);
00205
compactRepresentationShrinkNum(t);
00206
compactRepresentationRangesAndOrdinals(t);
00207
00208
int s=0;
00209
int d=0;
00210
00211
00212
while (t[s])
00213
if (t[s]!=
'-')
00214 t[d++]=t[s++];
00215
else s++;
00216
00217 t[d]=0;
00218
00219
00220 s=0;
00221 d=0;
00222
while (t[s])
00223 {
00224 t[d++]=t[s++];
00225
while (t[s] && (t[s]==t[d-1])) s++;
00226 }
00227
00228
if (t[d-1]==
'.') d--;
00229 t[d]=0;
00230
00231
char c =
'#';
00232 d=0;
00233
do
00234 {
00235
char tt = t[d];
00236 t[d]=c;
00237 c=tt;
00238 d++;
00239 }
while (c);
00240 t[d]=0;
00241 }
00242
00244 int numericType(
const char *mot)
00245 {
00246
if (
looksNumeric(mot))
00247 {
00248
int classe=0;
00249
char t[128];
00250
bool pourcent=
false;
00251 strcpy(t,mot);
00252
00253
compactRepresentation(t);
00254
00255
00256
00257
if (
char *tt= strchr(t,
'%'))
00258 *tt=0, pourcent =
true;
00259
00260
for (
int i=0; (
rules[i].
pattern[0]) && (!classe); i++)
00261
if (strcmp(
rules[i].pattern,t)==0) classe =
rules[i].
attributs;
00262
00263
if (pourcent) classe +=
NT_PERCENT;
00264
00265
return classe ? classe :
NT_UNKNOWN_NUMERIC_TYPE;
00266 }
00267
else return NT_NOT_NUMERIC;
00268 }
00269
00270
00271
00272 }