Avaleht
uus teema   vasta Tarkvara »  Programmeerimine »  sql, INT ja komad märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
mine lehele 1, 2  järgmine
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 06.09.2010 18:28:16 sql, INT ja komad vasta tsitaadiga

Tervist,
kuna sql tabelis INT ei saa salvestada komasid siis tuleks raha sisestada varchar?!
Aga kuidas kontrollida, et input oleks sisestatud ainult numbrid ja 1 koma/punkt?
Ja kui peaks arvutama SUM raha kokku kas siis koma ja punkt teevad sama välja?
Või peaks sentide puhul lubama ainult punkti kasutada?
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 06.09.2010 18:34:44 vasta tsitaadiga

selleks on väljatüüp "DECIMAL". Seal on võimalik määrata maksimumpikkus enne- ja pärast koma.
_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 06.09.2010 18:43:50 vasta tsitaadiga

Sa peaks ennem salvestamist midagi sellist vast tegema.

$nr="2,45";
$nr=str_replace(",",".",$nr); // asendab komad punktiga
if(is_numeric($nr)){echo "On number";} // salvestad
else
{echo "Pole number";} // annad veateate

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 06.09.2010 19:34:59 vasta tsitaadiga

Suured tänud, sain kõik töötama nagu vaja.
Aga üks asi ei meeldi, nimelt Decimal 8,2 jätab kaks 0 taha isegi siis kui sente pole sisestatud.
näiteks 5.- teeb 5.00.-
Kas selle vastu ka rohtu on?
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 06.09.2010 21:05:03 vasta tsitaadiga

redenergy, rohtu vast ei ole, kui soovid eemaldada, siis pead selle ise ära tundma.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 06.09.2010 21:29:27 vasta tsitaadiga

Abiks ehk http://php.net/manual/en/function.number-format.php
_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 06.09.2010 22:09:50 vasta tsitaadiga

Kui keegi peaks sarnase asja vastu huvi tundma, siis toon endapoolse lahenduse mis leidsin.
php-brief:
  1.  
  2. $value = trim(trim($value, '0'), '.');
  3.  

See kaotab lõpust nullid. Samas häirima jäi see, et kui sisestada 3.50 siis ei tahaks, et 0 kaob.

Lahendus siis varchar ja enne andmebaasi lisamist kontroll, et oleks number. iisi

Tänan
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
Fukiku
Kreisi kasutaja
Fukiku

liitunud: 06.11.2003




sõnum 06.09.2010 22:19:07 vasta tsitaadiga

Numbrite hoidmine baasis VARCHAR välja peal on iseenesest saatanast väga mitmetel põhjustel - alustades sellest, et sa ei garanteeri sellisel juhul 100% kindlusega, et sealt baasist alati number tuleb, kui sa seda ootad, kuni selleni, et sa ei saa näiteks teha päringuid stiilis "WHERE hind > 5".

Numbrite ilusaks vormistamiseks veebis näitamisel sobiksid ikkagi minu viidatud php funktsioon või mõni neist, millele viidatakse antud funktsiooni juurest "see also" alajaotuses.

_________________
Foxic is just a simple fox
Enne kui sa küsid oma küsimuse - küsi seda vannipardilt! Rangelt soovitatav enne programmeerimise alafoorumisse uue teema tegemist.
Kommentaarid: 2 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 2
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 06.09.2010 22:21:20 vasta tsitaadiga

AB'st tuleb stringina tagasi väärtus? Saad ju teha tuima võrdluse
php:
  1. if(substr($value, -2) == '00') {
  2.   $value = substr($value, 0, -3);
  3. }
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 06.09.2010 23:09:41 vasta tsitaadiga

Fukiku, olen jälle targem.
mikk36, suured tänud.
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
mirko28
Aeg maha 1p
mirko28

liitunud: 31.12.2003




sõnum 07.09.2010 23:49:29 vasta tsitaadiga

Metoodiliselt on isegi parem kui proovid mitut lahendusviisi, sh ka lahendust, kus salvestad arve tekstina andmebaasi;)
Kommentaarid: 5 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 4
tagasi üles
vaata kasutaja infot saada privaatsõnum
sosssepp
HV veteran
sosssepp

liitunud: 12.05.2003




sõnum 08.09.2010 00:04:34 vasta tsitaadiga

Arve tekstina salvestades kulutad kettapinda juba palju rohkem, tõenäoliselt ka muid ressursse.
Kommentaarid: 87 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 75
tagasi üles
vaata kasutaja infot saada privaatsõnum
blinx
HV vaatleja

liitunud: 28.11.2009




sõnum 08.09.2010 13:11:13 vasta tsitaadiga

ma olen näinud et peale isnumeric kontrollitakse ka, et ei oleks tegu hex väärtusega
see on muidugi siis kui sa tahad, et su funktsioonid oleks hästi defineeritud ja suletud iga võimaliku argumentide kombinatsioonoi suhtes

_________________
'Just buy everything then you're safe'
tagasi üles
vaata kasutaja infot saada privaatsõnum
tola555
HV vaatleja

liitunud: 29.06.2005




sõnum 20.09.2010 19:26:19 vasta tsitaadiga

mis andmebaasihaldamise süsteemiga tegu on? Osadel on raha jaoks spetsiaalsed tüübid nagu http://www.postgresql.org/docs/8.3/static/datatype-money.html , ka numeric on mõnes kohas olemas.

Vaata, et float ümardama ei hakkaks. Mina väldiks float-i ja double-it. Katseks võid sisestada 0.00000...001 või 0.99...99 ja pärast proovi sql-iga pärida, kas saad tagasi selle sama arvu.
Kommentaarid: 3 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 3
tagasi üles
vaata kasutaja infot saada privaatsõnum
redenergy
HV veteran
redenergy

liitunud: 22.03.2004




sõnum 20.09.2010 20:02:16 vasta tsitaadiga

Kas money_format kasutades on võimalik EEK arvu taha tuua?
Või kas õigem ongi nii, et EEK 2.50 mitte 2.50 EEK?
Kommentaarid: 30 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 9
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 20.09.2010 21:20:15 vasta tsitaadiga

Pigem on abstraktne summa, ühiku võid ise eraldi tulpa panna.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
serk
HV kasutaja

liitunud: 24.05.2003




sõnum 24.09.2010 23:17:10 vasta tsitaadiga

redenergy kirjutas:
Kas money_format kasutades on võimalik EEK arvu taha tuua?
Või kas õigem ongi nii, et EEK 2.50 mitte 2.50 EEK?


Mitme valuutalises keskkonnas peab summa juures alati olema valuuta, selles suhtes on sul õigus, aga kindlasti eraldi veerus. Summa veeru loomisel mõtle läbi mida sa sinna ikkagi salvestad, suurus ja komakohad. Korralik ja läbimõeldud andmemudel toob põhimõttelised vead koodi arendusel ruttu välja.
Kommentaarid: 8 loe/lisa Kasutajad arvavad:  :: 1 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
2korda2
HV kasutaja

liitunud: 19.07.2003




sõnum 25.09.2010 10:16:24 KISS vasta tsitaadiga

Jäke palun meelde järgmised elementaarsed põhimõtted:
1. Rahaline summa/hind on alati number(x,y). Enamasti y=2. Erandid: ühikuhind (1 tiku hind), eelarve (üldjuhul kõik ümardatud täisarvuni või isegi tuhandete/miljoniteni, näiteks: "Käive: 1 700 tuhat krooni") jms
2. Hinnad ja summad joondatakse tulpades ALATI paremale.
3. Kui väärtuses, mida kuvatakse võivad olla ka komakohad, siis tuleb ALATI need kõik kuvada (vaata p1 formaati), sõltumata sellest kas seal on 00 või midagi muud. See on asi, millele ma olen siinsamas HV-s korduvalt tähelepanu juhtinud aga millegipärast pole ikka kohale jõudnud. Põhjus on elementaarne (leia loetelust suurim väärtus):
17.10
121
1100
130.20

4. Mitme valuuta puhul on universaalseim lahendus lisada eraldi valuuta veerg. Summasid seejuures oleks soovitav hoida mitmes veerus: summa näidatud valuutas, summa põhivaluutas. On loll idee hakata valuutakursse arvestama hetkel, kui raamatupidur vms teeb oma kuuaruannet. Eriti "kaval" arendaja liidab muidugi külma kõhuga kokku USD ja EUR summad.
5. Kui tegelete arvetega, siis jälgige, et ridade summa=päise summa. Ka võõrvaluutas. Märksõna: ümardusvahed.

Idee hakata arvulist väärtust varchar väljal hoidma väärib Darwini auhinda (läheb jagamisele koos ideega "hoiame arvet tekstilisena"). Tänu selliste mõttemeistrite lahendusele oli minu eelmise projekti migreerimise maht esialgse <500 tunni asemel lõpuks rohkem kui 1000 tunniga lõhki. Tõsi, seal oli lisaks eeltoodutele ka muid "häid" ideid:
1. kuupäev - varchar (kasutajal vabatekstiväli). Nüüd teisenda muuhulgas väärtused 05.06.07, 27.15.07, 21.jaan.1970, kolmapäev. Lahenduse juures arvesta, et kirjeid on miljonites.
2. Hulk väärtusi, mida tuleks eristada - teeme suure varchari, kasutajale vabatekstivälja ja las kasutajad ise otsustavad, mis nad eraldajana kasutavad (tädiautomaat on kõige süstemaatilisem andmesisestaja, eksole). Kirjed taas miljonites.
jne...

Andmemudel ei ole lihtsalt linnukese tegemise koht. Korralik andmemudel vähendab tunduvalt ohtu, et mõne aasta pärast tuleb uuele arendajale piinlikult selgitada oma varasemaid "leiutisi".
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 27.09.2010 12:01:17 vasta tsitaadiga

Mul Oracle 10g baasis sätitud koma kohaks "koma" (locale EST) ja php on koma kohaks "punkt" (pole saanud komaga tööle). Häda ka selles et 0,2323 arvude puhul Oracle ei anna "0", vaid trükib ,2323. Selleks tegin ühe funktsiooni, pole küll tugev käpp selles aga igatahes töötab (ta teeb "koma" ümber "punktiks" ka):

php:
  1. function koma($value) {
  2.  
  3.  $string = str_replace("," ,".", $value);
  4.  $tehtud = 0;
  5.  
  6.  if ($string > -1 And $string < 0) {
  7.   $tulemus = str_replace(array("-.","-0."),array("-0,","-0,"),$string);
  8.   $tehtud = 1;
  9.  }
  10.  if ($string < 1 And $string > 0) {
  11.   $vahe = ltrim($string,"0");
  12.   $tulemus = str_replace(".", "0,", $vahe);
  13.   $tehtud = 1;
  14.  }
  15.  if ($tehtud == 0) {
  16.   $tulemus = str_replace("." ,",", $string);
  17.  }
  18.   return($tulemus);
  19. }


Ehk on abi.
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 27.09.2010 12:33:18 vasta tsitaadiga

Le Inc, selline funktsioon ei sobi?
php:
  1. function koma($value) {
  2.   $value = str_replace(',', '.', $value);
  3.   $value = floatval($value);
  4.   return str_replace('.', ',', $value);
  5. }
php:
  1. var_dump(koma("0.123"));
  2. var_dump(koma("0,123"));
  3. var_dump(koma(".123"));
  4. var_dump(koma(",123"));
  5. var_dump(koma("-.123"));
  6. var_dump(koma("-,123"));
  7. var_dump(koma("2.123"));
  8. var_dump(koma("2,123"));
  9.  
  10. /*
  11. string(5) "0,123"
  12. string(5) "0,123"
  13. string(5) "0,123"
  14. string(5) "0,123"
  15. string(6) "-0,123"
  16. string(6) "-0,123"
  17. string(5) "2,123"
  18. string(5) "2,123"
  19. */
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 27.09.2010 13:47:18 vasta tsitaadiga


number_format(str_replace(',', '.', $value), 2, ',', false);
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 27.09.2010 13:57:25 vasta tsitaadiga

nemu, antud funktsiooni kasutamine seab piirangu ette komakohtade arvuga, mistõttu võib kohati kehv lahendus olla.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
nemu
HV vaatleja
nemu

liitunud: 22.01.2002



Autoriseeritud ID-kaardiga

sõnum 27.09.2010 15:10:37 vasta tsitaadiga

Kõige pealt tuleks oracle vastavad parameeterid kohendada:
NLS_LANGUAGE="AMERICAN"
või siis vähemalt
NLS_NUMERIC_CHARACTERS="."


"kohati kehv" == "enamasti vajalik/õige"

php:
  1.  
  2. setlocale(LC_ALL, 'estonian');
  3.  
  4. function koma2($value, $decimals = 2)
  5. {
  6.   return number_format($value, $decimals, ',', false);
  7. }
  8.  
  9. var_dump(koma2('-57', 5));
  10. var_dump(koma2('1.234567890', 5));
  11.  
  12. /*
  13. string(9) "-57,00000"
  14. string(7) "1,23457"
  15. */
  16.  
Kommentaarid: 12 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 11
tagasi üles
vaata kasutaja infot saada privaatsõnum
Le Inc
HV Guru
Le Inc

liitunud: 06.09.2002



Autoriseeritud ID-kaardiga

sõnum 27.09.2010 15:24:39 vasta tsitaadiga

mikk36 kirjutas:
Le Inc, selline funktsioon ei sobi?

Kindlasti sobib, ilusam ja lühem on sul. icon_biggrin.gif Ma kui pühapäeva programmeerija ei tee asju just nii nagu peaks. icon_lol.gif
Kommentaarid: 56 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 54
tagasi üles
vaata kasutaja infot saada privaatsõnum
mikk36
HV Guru
mikk36

liitunud: 21.02.2004




sõnum 27.09.2010 15:41:01 vasta tsitaadiga

Mitte et ma mingi erilisem oleks, samuti hobikorras vaid.
Kommentaarid: 85 loe/lisa Kasutajad arvavad:  :: 0 :: 2 :: 78
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  Programmeerimine »  sql, INT ja komad mine lehele 1, 2  järgmine
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.