Kuinka toteuttaisin semmoisen phpllä että saisin vaikka $puhnum = "0401283789" muutettua muotoon $puhnum = "040 128 3789" ?
Katko teksti substr-funktiolla ja yhdistä osat välien kera.
Oli tylsää ja tein tällaisen funktion. Se tukee siis myös lankapuhelinnumeroita ja maksullisia numeroita.
<?php // (C) Olli <ollinpostit@gmail.com> // Saa käyttää, mutta älä levitä function telFormat($num, $return="return"){ $format = array( 11 => array(0,4,4,3,7,4), 10 => array(0,3,3,3,6,4), 9 => array(0,2,2,3,5,4), 8 => array(0,2,3,3,6,3), 6 => array(0,2,2,4,0,0) ); $len = strlen($num); if(!array_key_exists("".$len."", $format)){ return"ERR"; } else { $first = substr($num, $format[$len][0], $format[$len][1]); $second = substr($num, $format[$len][2], $format[$len][3]); $third = substr($num, $format[$len][4], $format[$len][5]); if($return == "return"){ $num = "".$first." ".$second." ".$third.""; return $num; } elseif($return == "array"){ $num = array($first, $second, $third); return $num; } elseif($return == "print"){ $num = "".$first." ".$second." ".$third.""; print $num; } } } ?>
Toimintaesimerkki:
<?php print telFormat("0501234567"); ?>
Kirjottelin tuohon kunnolliset ohjeetkin, mutta kone kaatui eikä ohjeet tallentunut.
Siistitty versio Ollin koodista. Poistin tarpeettomia koodirivejä välistä.
<?php function telFormat($num) { $format = array( 11 => array(0,4,4,3,7,4), 10 => array(0,3,3,3,6,4), 9 => array(0,2,2,3,5,4), 8 => array(0,2,3,3,6,3), 6 => array(0,2,2,4,0,0) ); $len = strlen($num); $first = substr($num, $format[$len][0], $format[$len][1]); $second = substr($num, $format[$len][2], $format[$len][3]); $third = substr($num, $format[$len][4], $format[$len][5]); $num = $first . " " . $second . " " . $third; return $num; } print telFormat("0501234567"); ?>
No joo tuo olikin vähän tarpeeton jota itse laitoin nuo lisäykset =)
En nyt oikein ymmärrä tuon Ollin koodin kompleksisuutta ja mielestäni se formatoi kuusinumeroiset numerot väärin, eikä parsi ollenkaan tietyn pituisia numeroita. Teinpä siis oman versioni.
Tulokset muuten samat, paitsi että mielestäni oma skriptini purkaa 6- ja 7-pituiset numerot hienommin ja työstää 8-pitkät eri tavalla. En kyllä tiedä, mikä numero edes on kahdeksan numeron pituinen.
function telFormat2($number) { $len = strlen($number); if ($len <= 5) return $number; if ($len == 6) return sprintf('%s %s', substr($number, 0, 3), substr($number, 3)); $return .= sprintf( '%s %s %s', substr($number, 0, -7), substr($number, -7, 3), substr($number, -4) ); }
Vaan enpähän ymmärrä sitäkään, että mikä tässä oli kysymyksen arvoista.
8 numeron pituinen numero: 019 12 345
Tältä sivulta katselin nuita erilaisia numeroita:
http://www.kotus.fi/index.phtml?s=2579
Ja kyllähän tuo ihan oikein ne kuusinumeroiset muotoilee
091234 => 09 1234
eli juuri tuon Kotimaisten kielten tutkimuskeskuksen suosituksen mukaan.
Ei se kyllä mikään suositus ole, kuten itsekin toteavat. Itse katsoin vähän vanhempaa matskua ja siellä oli ryhmittelyt miten sattuu. Tuo kuusinumeroinen esimerkki sitä paitsi sisältää suuntanumeron, joten ryhmittely on luonnollisesti eri kuin numerossa, jossa "tunnisteosa" on kuuden pituinen. Kolmannella rivillä on esimerkki tällaisesta numerosta ja se on ryhmitelty kolmen pareihin.
Oikeasti nuo pitäisi jaotella niin, että ensin tulee suuntanumero, ja sen jälkeen loppuosa jaettuna kahteen osaan, paitsi jos korkeintaan 4 numeroa jolloin yhdessä osassa.
Eli numeron pituudella on merkitystä vasta, kun suuntanumero on saatu irti.
Grez kirjoitti:
Oikeasti nuo pitäisi jaotella niin, että ensin tulee suuntanumero, ja sen jälkeen loppuosa jaettuna kahteen osaan, paitsi jos korkeintaan 4 numeroa jolloin yhdessä osassa.
Eli numeron pituudella on merkitystä vasta, kun suuntanumero on saatu irti.
Suuntanumeron voi minusta olettaa hyvin pitkälti olevan viimeistä seitsemää numeroa edeltävä rimpsu (3-4 numeroa). Tuolla Kotusin sivuilla on esitelty myös numeroa, jossa on 3+8 numeroa, mutta liekö tällaisia sitten oikeasti käytössä?
Selkeästi skripti on tulossa amatöörin kotikäyttöön, joten sen ei tarvitse osata parsia kaiken maailman vinkuintialaisia erikoisnumeroita. De facto kännykkänumero on 3+7 numeroa pitkä, joidenkin markkinointiuunojen numerot 4+7.
The Alchemist kirjoitti:
Selkeästi skripti on tulossa amatöörin kotikäyttöön, joten sen ei tarvitse osata parsia kaiken maailman vinkuintialaisia erikoisnumeroita. De facto kännykkänumero on 3+7 numeroa pitkä, joidenkin markkinointiuunojen numerot 4+7.
No eiköhän tässä kaikki viestit 3. jälkeen ole muuta pohdiskelua, kuin aloittajan tarpeeseen vastaamista. Eikä edes aloittaja sanonut, että kyseessä on ainoastaan matkapuhelinnumerot. Kännykkänumeroitakin on aika paljon 4+6 -numeroisia ja jokin verran lyhyempiä, esim. 3+4. 4+7 -numeroisiin en ole itse törmännyt.
Markkinointinumerot (pituus 11nroa) pitäisi toimia tuolla minun funktiolla.
Grez kirjoitti:
No eiköhän tässä kaikki viestit 3. jälkeen ole muuta pohdiskelua, kuin aloittajan tarpeeseen vastaamista.
Aloittajan tarve ei ole tullut selväksi. Otsikko puhuu kolmijakoiseksi parsimisesta, mutta eihän se ole mitenkään yksiselitteinen tehtävänasettelu (ja käytettävä ohjelmointikieli jää pääteltäväksi).
Epäselvää on sekin, mitä ongelmaa ollaan varsinaisesti ratkaisemassa. Jos kyse on puhelinnumeroiden tulostamisesta ihmisen luettavaan muotoon, niin silloin kyllä suomalainen standardi ja kansainvälinen ITU-T:n suositus sanovat asiasta jotain, mutta eivät ihan yksiselitteisesti eikä niiden mukainen muoto ole välttämättä käytännössä yleisin kaikissa maissa.
Grez kirjoitti:
Oikeasti nuo pitäisi jaotella niin, että ensin tulee suuntanumero, ja sen jälkeen loppuosa jaettuna kahteen osaan, paitsi jos korkeintaan 4 numeroa jolloin yhdessä osassa.
Eli numeron pituudella on merkitystä vasta, kun suuntanumero on saatu irti.
Tähän lisäisin vielä +358500123456 = +358 500 123 456
Toisaalta ryhmittelystä pitäisi päästä eroon, koska c/p moniin palveluihin
ei toimi, tarkistus hyväksyy vain numeromerkit.
HTML:ssä ryhmittelyn voi tehdä span-tageilla, joilla on pieni padding. Näin tulos näyttää tyylikkäältä mutta kopioituu ilman välejä.
Tässä span-tageilla toimiva versio minun koodista (Teuron lyhennys):
<?php function telFormat($num) { $format = array( 11 => array(0,4,4,3,7,4), 10 => array(0,3,3,3,6,4), 9 => array(0,2,2,3,5,4), 8 => array(0,2,3,3,6,3), 6 => array(0,2,2,4,0,0) ); $len = strlen($num); $first = substr($num, $format[$len][0], $format[$len][1]); $second = substr($num, $format[$len][2], $format[$len][3]); $third = substr($num, $format[$len][4], $format[$len][5]); $span = '<span style="padding-right:5px">'; $num = "".$span."".$first."</span>".$span."".$second."</span>".$span."".$third."</span>"; return $num; } print telFormat("0501234567"); ?>
Ei ole testattu, mutta jos joku jaksaa testata..
Sievennystä...
$num = array($f, $s, $t); printf( '<span class="telnum"><span>%s</span></span>', implode('</span><span>', $num) );
span.telnum > span { margin: 0 2px; }
Spaneja käyttäessä pitää vain muistaa se, ettei tagien väliin saa jättää whitespacea tai muuten sanavälit tulevat myös kopioituun tekstiin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.