Le forum (ô combien francophone) des utilisateurs de Powerbuilder.
Bonjour à tous,
J'ai un soucis, je dois calculer le modulo d'un nombre, le soucis est que ce nombre est un STRING "0042" et lorsque je le passe en LONG il devient 42.
Y a t il une possibilité de conserver les deux zéro qui disparaissent ?
Cordialement
Dernière modification par julien (05-11-2008 15:34:59)
Hors ligne
Tu peux le repasser en string avec le formattage adéquat:
Long ll_number String ls_number ll_number = 42 ls_number = String( ll_number, '0000' )
Hors ligne
En fait, je voudrez faire l'inverse
Long ll_number String ls_number ls_number = "0042"
mais lorsque je fais :
ll_number = Long(ls_number)
j'obtiens ll_number = 42 alors que je voudrais ll_number = 0042
sinon, et t il possible de calculer le modulo d'un nombre composé de 29 chiffres ?
Hors ligne
en numérique 0042 = 42...
Hors ligne
oui je sais bien,
je vais essayer autrement.
Existe t-il une fonction permettant de vérifier si un IBAN est bon ?
Est il possible de calculer le modulo d'un nombre composé de 29 chiffres ?
Hors ligne
Un petit sous pb donne:
Aide pb 10.5 a écrit:
Decimal or Dec
Signed decimal numbers with up to 18 digits. You can place the decimal point anywhere within the 18 digits—for example, 123.456, 0.000000000000000001 or 12345678901234.5678.
Using literals To assign a literal value, use any number with a decimal point and no exponent. The plus sign is optional (95 and +95 are the same). For numbers between zero and one, the zero to the left of the decimal point is optional (for example, 0.1 and .1 are the same). For whole numbers, zeros to the right of the decimal point are optional (32.00, 32.0, and 32. are all the same). For example:
12.34 0.005 14.0 -6500 +3.5555
Double
A signed floating-point number with 15 digits of precision and a range from 2.2250738585073E-308 to 1.79769313486231E+308.
Integer or Int
16-bit signed integers, from -32768 to +32767.
Using literals To assign a literal value, use any whole number (positive, negative, or zero). The leading plus sign is optional (18 and +18 are the same). For example:
1 123 1200 +55 -32
Long
32-bit signed integers, from -2147483648 to +2147483647.
Using literals Use literals as for integers, but longer numbers are permitted.
LongLong
64-bit signed integers, from -9223372036854775808 to 9223372036854775807.
Using literals Use literals as for integers, but longer numbers are permitted.
Real
A signed floating-point number with six digits of precision and a range from 3.402822E-38 to 3.402822E+38.
Using literals To assign a literal value, use a decimal value, followed by E, followed by an integer; no spaces are allowed. The decimal number before the E follows all the conventions specified above for decimal literals. The leading plus sign in the exponent (the integer following the E) is optional (3E5 and 3E+5 are the same). For example:
2E4 2.5E38 +6.02E3 -4.1E-2
-7.45E16 7.7E+8 3.2E-38
Du moment que tu utilises le bon type, ça devrait passer pour la fonction Mod. (A tester cependant)
Hors ligne
Si tu regardes, meme le LongLong est trop petit !
Hors ligne
julien a écrit:
Existe t-il une fonction permettant de vérifier si un IBAN est bon ?
Hors ligne
Pour ton IBAN, je n'ai pas de fonction toute faite à te proposer.
Par contre, un petit Match sur ton IBAN converti en string devrait déjà t'aider à vérifier que son formattage est bon.
Ensuite, tu le convertis en type numérique pour faire ton calcul de modulo. Pour les autres règles de constitution d'un IBAN, à toi de trouver ça dans la doc ou sur le Net (wikipedia par exemple ). Tu devrais pouvoir faire une fonction de vérification générique sans trop de problème, en découpant ta chaîne de caractère pour vérifier la validité des codes banque, guichet, etc...
[EDIT]
Grillé par erasorz et pick
Hors ligne
j'ai deja realisé la fonction le seul soucis est la derniere etape :
par exemple le calcul de :
Mod(long("18205004254886248579215425856"), 97)
là PB ne peut pas le faire car le STRING ne rentre pas dans le LONG
Hors ligne
Tu as essayé la fonction de Pick? (Pour info, les Double ou Real font des effets kisscool du fait de leur manque de précision)
Hors ligne
ca me met un chiffre a virgule avec une puissance de 10 a la fin
Hors ligne
Moi, je dis qu'il faut simplement que tu implémente une fonction de modulo sur des grands nombres fournis en string. J'avais fait ça pour addition, soustraction, multiplication et division, ça m'avait pris dans les 1/2h - 1h tests compris...
Ca doit pas être sorcier... Non?
Hors ligne
J'avais eu le même soucis pour convertir des hexadécimaux (string) en décimaux (long) : si mes hexadécimaux étaient trop grands, ça ne rentrait pas dans des long. On avait aboutit à la même conclusion : utiliser des string représentant mes décimaux.
Hors ligne
Bonjour,
Le calcul du modulo en passant par un type decimal ne pose aucun problème :
decimal ldc_reste, ldc_verif = 18205004254886248579215425856.0
ldc_reste = Mod(ldc_verif, 97)
Je pratique de cette façon pour vérifier la clé RIB.
Hors ligne
j'ai utilisé une autre methode, j'ai decouper le nombre en paquet de quatre et j'ai calculé les modulo de chaque partie
Hors ligne