Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

DeFigueiredo

Ler um Número

Mensagens Recomendadas

DeFigueiredo

Boas,

queria colocar uma questão é o seguinte que função devo usar ou que maneira para que ao ser introduzido um número (numérico), seja apresentada a sua leitura


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
anolsi

Estás a falar de ser colocado "10" e ele apresentar "dez"?


"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

Exacto.

O utilizador insere um número e depois é apresentada a sua leitura, terão de ser em duas línguas, mas o que quero é mesmo a parte de fazer a leitura


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
anolsi

Fazer a leitura? Estás a dizer ler um número dado pelo utilizador? Para isso precisas de HTML, ou então o parâmetro tem que ser passado por GET...


"Nós somos o que fazemos repetidamente, a excelência não é um feito, e sim, um hábito."
Não respondo a questões por PM que possam ser colocadas no fórum!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

O que ele quer é fazer a leitura por extenso (pelo menos eu percebi isso). Não há nenhuma função predefinida que te faça isso, mas podes pesquisar no Google por alguma. No entanto duvido que encontres encontres, muito menos em Português.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

OK...

o objectivo é o seguinte:

Exemplo 1: http://localhost/numero_por_extenso.php?numero=245

Resultado: Duzentos e quarenta e cinco

OU

Exemplo 2: http://localhost/numero_por_extenso.php?numero=245

Resultado: Two hundread and fourty five.

Pronto, eu duvido que haja alguma função que me devolva isso, por isso perguntei, mas não havendo de que forma posso fazer com que me retorne a leitura por extenso do número


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Tens de criar uma tu. Verificas se o número é maior do que 100, depois lês. Verificas se é maior do que mil, depois lês.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

eu tenho de fazer ate 99999...

então a cada mil tenho de verificar, para fazer a leitura, a minha dúvida é como fazer a leitura é aí que estou a criar confusão...


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
IRX773

Pelo que sei de PHP vais ter de o fazer à mão.

Agora imagina que é o numero 87562... acho um bocado inviável isso.

if ($a > 100)
  echo "Número demasiado grande";

if ($a == 1)
  echo "Um";

if ($a == 2)
  echo "Dois";

....

if ($a == 99999)
  echo "Noventa e nove mil novecentos e noventa e nove";

Tens é de fazer uma verificação (com if) antes para saber se é em inglês ou português por isso uma radiobox ou checkbox para colocar nas duas ao mesmo tempo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Não é preciso ser à mão. ;) Ele tem é de criar um algoritmo que saiba ler os respectivos números e as respectivas excepções. :(

@DeFigueiredo Não. Repara, quando ele é maior que cem, o primeiro quatro tu dizes "quatrocentos", o primeiro cinco tu dizes "quinhentos", mas se for maior que dez e menor que cem, o primeiro quatro tu dizes "quarenta", e o primeiro cinco "cinquenta". É por isso que tu precisas de verificar, para saberes como é que dizes cada número.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

então o ideal é colocar tudo dentro de um for, que vá de 0 a 99999, e depois vários if's para fazer a verificação. Certo ?

isso eu compreendi, agora a questão que não estou a entender, ou estou a confundir, é que, imaginando, 456, tenho de apresentar "Quatrocentos e cinquenta e seis". nao vou fazer um if para verificar esse numero.

Ou terei de dividir como tem 5 casas, EX:

Centena de Milhar, Dezena de Milhar, ilhar, Centena, Dezena e Unidade

Dividindo por casas, e depois dentro dessas fazer as verificaçoes...

Centena de milhar

Se for 9 lê-se "Novecentos mil"

Se for 8 lê-se "Oitocentos mil"

....

Depois passar para as Dezenas de Milhar

Se for 9 lê-se "Noventa Mil"

Se for 8 lê-se "Oitenta  mil"

...

Isto até chegar as unidades...


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Exacto. Verificas qual é a casa do número, e depois imprimes todos por extenso.


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

Certo estou a entender... Peço desculpa de ser chato mas sou um Novato em PHP

agora em relação a parte de verificar se é ingles ou portugues, isso é consoante a lingugem do browser, mas como se verifica ?


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

            <?php
	function numero_PT_EN($num){
                $tam = strlen($num);
                    
	//print('<br/>');
                //print($n);
                if ($_SERVER{"HTTP_ACCEPT_LANGUAGE"} == "pt-PT"){                 
		for($pos_num=0;$pos_num<=$tam-1;$pos_num++){

                        if (($tam-$pos_num-1 == 0) || ($tam-$pos_num-1 == 3))
                                unidade_PT($num,$pos_num,$tam-$pos_num-1);
		elseif (($tam-$pos_num-1 == 1) || ($tam-$pos_num-1 == 4))
                                $pos_num = dezena_PT($num,$pos_num,$tam-$pos_num-1);
		else
                                centena_PT($num,$pos_num,$tam-$pos_num-1);
		if ($tam-$pos_num-1 == 3)
                                print(" Mil ");	
                        }
                    }else{
                        for($pos_num=0;$pos_num<=$tam-1;$pos_num++){
                            if (($tam-$pos_num-1 == 0) || ($tam-$pos_num-1 == 3))
                                unit_EN($num,$pos_num,$tam-$pos_num-1);
                           elseif (($tam-$pos_num-1 == 1) || ($tam-$pos_num-1 == 4))
                                $pos_num = dozen_EN($num,$pos_num,$tam-$pos_num-1);
                           else
                                hundred_EN($num,$pos_num,$tamanho-$pos_num-1);
                           if ($tam-$pos_num-1 == 3)
                                print(" Thousand ");                                           
                        }
                    } 
	}

                function unidade_PT($unidade,$pos_num,$pos_actual){
                    
                    switch ($unidade{$pos_num}){
                    case '0': 
                        if (strlen($unidade) == 1)
                            print("Zero ");break;
                    case '1': if ($pos_actual != 3 || $pos_num >= 1)
                                print("Um");break;
                    case '2': print("Dois ");break;
                    case '3': print("Tres ");break;
                    case '4': print("Quatro ");break;
                    case '5': print("Cinco ");break;
                    case '6': print("Seis ");break;
                    case '7': print("Sete ");break;
                    case '8': print("Oito ");break;
                    case '9': print("Nove ");
                    }
                }

                function dezena_PT($dezena,$pos_num,$pos_actual){
                    
                    switch ($dezena{$pos_num}){
                    case '0': print("");break;
                    case '1': switch($dezena{$pos_num+1}){
                                case '0': print("Dez ");break;
                                case '1': print("Onze ");break;
                                case '2': print("Doze ");break;
                                case '3': print("Treze ");break;
                                case '4': print("Catorze ");break;
                                case '5': print("Quinze ");break;
                                case '6': print("Dezasseis ");break;
                                case '7': print("Dezassete ");break;
                                case '8': print("Dezoito ");break;
                                case '9': print("Dezanove ");break;
                                }
                                return ++$pos_num;
                    case '2': print("Vinte ");break;
                    case '3': print("Trinta ");break;
                    case '4': print("Quarenta ");break;
                    case '5': print("Cinquenta ");break;
                    case '6': print("Sessenta ");break;
                    case '7': print("Setenta ");break;
                    case '8': print("Oitenta ");break;
                    case '9': print("Noventa ");
                    }

                    ///VER
                    if ($dezena{$pos_num+1} != 0 && ($pos_actual < 3 && $dezena{$pos_num+1} != 0))
                        print ("e ");
                    return $pos_num;
                }

                function centena_PT($centena,$pos_num,$pos_actual){
                    
                    switch ($centena{$pos_num}){
                    case '0': print("");break;
                    case '1': //if ($pos_actual>2)
                                //print("e ");
                              if (($centena{$pos_num+1}  == '0') && ($centena{$pos_num+2}  == '0'))
                                print("Cem ");
                              else
                                print("Cento ");break;
                    case '2': print("Duzentos ");break;
                    case '3': print("Trezentos ");break;
                    case '4': print("Quatrocentos ");break;
                    case '5': print("Quinhentos ");break;
                    case '6': print("Seiscentos ");break;
                    case '7': print("Setecentos ");break;
                    case '8': print("Oitocentos ");break;
                    case '9': print("Novecentos ");
                    }
                    if (($centena{$pos_num+1} != 0) || ($centena{$pos_num+1} != 0))
                        print ("e ");                        
                }

                function unit_EN($unit,$pos_num,$pos_actual){

                    switch ($unit{$pos_num}){
                    case '0':
                        if (strlen($unit) == 1)
						print("zero ");break;
                    case '1': print("One ");break;
                    case '2': print("Two ");break;
                    case '3': print("Three ");break;
                    case '4': print("Four ");break;
                    case '5': print("Five ");break;
                    case '6': print("Six ");break;
                    case '7': print("Seven ");break;
                    case '8': print("Eight ");break;
                    case '9': print("Nine ");
                    }
                }

                function dozen_EN($dozen,$pos_num,$pos_actual){

                    switch ($dozen{$pos_num}){
                    case '0': print("");break;
                    case '1': switch($dozen{$pos_num+1}){
                                case '0': print("Ten ");break;
                                case '1': print("Eleven ");break;
                                case '2': print("Twelve ");break;
                                case '3': print("Thirteen ");break;
                                case '4': print("Fourteen ");break;
                                case '5': print("Fifteen ");break;
                                case '6': print("Sixteen ");break;
                                case '7': print("Seventeen ");break;
                                case '8': print("Eighteen ");break;
                                case '9': print("Nineteen ");break;
                                }
                                return ++$pos_num;
                    case '2': print("Twenty ");break;
                    case '3': print("Thirty ");break;
                    case '4': print("Fourty ");break;
                    case '5': print("Fifty ");break;
                    case '6': print("Sixty ");break;
                    case '7': print("Seventy ");break;
                    case '8': print("Eighty ");break;
                    case '9': print("Ninety ");
                    }
                    return $pos_num;
                }

                function hundred_EN($hundred,$pos_num,$pos_actual){

                    switch ($hundred{$pos_num}){
                    case '0': print("");break;
                    case '1': print("One hundred ");break;
                    case '2': print("Two hundred ");break;
                    case '3': print("Tree hundred ");break;
                    case '4': print("Four hundred ");break;
                    case '5': print("Five hundred ");break;
                    case '6': print("Six hundred ");break;
                    case '7': print("Seven hundred ");break;
                    case '8': print("Eight hundred ");break;
                    case '9': print("Nine hundred ");
                    }
                    if (($hundred{$pos_num+1} != 0) || ($hundred{$pos_num+1} != 0))
                        print ("and ");
                }

			numero_PT_EN($_GET["num"]);
            ?>

Deixo aqui o código, mais o menos completo, todas as criticas ou ajudas para melhorar são bem-vindas....

A única coisa que falta é limitar para que quando o numero for maior que "99999", este apresente uma mensagem a dar erro... ou qualquer coisa do género


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
helt

Não precisas de retornar erro. Tipo, supondo que só interpretas até aos milhões, o user se te pedir 2 biliões tu devolves 2000 milhões.


––––•(-• [ ђєlt ] •-)•––––

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

sim não preciso... mas eu queria que fosse limitado... apenas até 99999

Os numeros superiores a esse não dessem, porque depois na leitura vai apresentar erros tambem.

e foi-me pedido que a leitura fosse limitada, ou seja, entre 0 e 99999


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

que recomendas para encurtar ?

todas as criticas e ajudas são bem-vindas...


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
helt

ao invés de teres um bloco igual de código para cada idioma, mete os textos dentro de variáveis, arrays, ou ficheiros. Tipo -> $TXT['ENG'][1000]=' Thousand ';


––––•(-• [ ђєlt ] •-)•––––

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

sim eu estou a entender o que querem dizer. Mas eu não posso usar array, ficheiros, etc...

Porque ainda nao demos isso...

A unica coisa  que me está a impugnar é o facto de estar a ter dificuldades em limitar a leitura a apenas numeros entre 0 e 99999 ...


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
scorch

Coloca isto perto do inicio da função.

//Verifica se o número é maior de 99999
if ($num > 99999){
    //Se for, termina a função e retorna a mensagem de erro.
    return("O Número não pode ser maior de 99999.");
}


scorch_pp.png

PS: Não respondo a perguntas por mensagem que podem ser respondidas no fórum.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

eu ja tinha feito algo do genero, mas com o "print", o problema é que apresentava a mensagem e depois o número em questão, ou seja, a leitura, e agora com o "return" não apresenta a mensagem... mas também não faz a leitura do número.


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
infopc
if ($num < 0 && $num > 99999) {
     die("Numero Inválido");
     //o die() mata o script portanto nada mais sera executado.
}


O que não tem solução, solucionado esta...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DeFigueiredo

Obrigado a todos...

O problema está resolvido... apenas um reparo infopc, neste caso tem de ser "ou ||" e não "and &&" porque senão o die só accionado se o numero introduzido for menor que zero e maior que 99999. o que é impossivel.

Agora se acham que posso melhor... Critiquem


Sandro Figueiredo

_________________________________________________________

"A paciência é uma das coisas que se aprendeu na era do 48k"

"O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.