1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Valor em euros por extenso

Discussão em 'Web Development' iniciada por vicix, 18 de Março de 2008. (Respostas: 9; Visualizações: 7614)

  1. boa noite,

    Tenho um valor dinâmico que neste exemplo é 399,80 €
    A minha dúvida é a seguinte, como consigo através do PHP automaticamente ele imprimir por extenso "Valor é: Trezentos e noventa e nove euros e oitenta cêntimos".

    Eu nunca vi coisa que precisa-se disto, mas como estou a fazer um programa, tenho que simplificar isto ao máximo sem o utilizador andar sempre a introduzir dados pelos formulários.

    Se alguém souber ou já viu uma coisa destas, eu agradeço.
     
  2. zoidberg

    zoidberg Folding Member

    penso que terás de definir todos os valores até um limite que aches plausivel ...

    um..dois..dez..vinte..cem..duzentos..quinhentos...

    depois fazes um algoritmo que verifique as casas em que estão os numeros introduzidos e atribuires-lhes os respectivos valores...
     
  3. theforbidden1

    theforbidden1 Banido

    isso é algoritmia básica, se não sabes fazer isso nem sequer é legitimo dizer que sabes programar.
    BTW o lugar para essa dúvida é no fórum da programação...
     
  4. Também pensei nisso, agora em PHP não sei como faço a detecção em strings. Não sei se tenho que usar os ditos comandos format e talvez depois usar as Regular Expressions.

    Obrigado pela ajuda. ;)


    muito obrigado pela tua simpatia, foi mesmo útil ver a tua opinião, está ajudar bastante num projecto que tenho que entregar amanha.

    E já agora eu não sou programador, sou WebDesigner, não tenho bases de algoritimia nem nada que se pareça, mas infelizmente sou tipico WebDesigner que também além de fazer Design tenho que programar.

    Resumindo e concluindo, a tua opinião deu a entender o seguinte: - Procura no Google Sr. Vicix.
     
  5. theforbidden1

    theforbidden1 Banido

    Errado. O que eu te disse foi para ires ao fórum da programação, fica aqui. Vais lá e ficas a aprender isso para sempre.

    Nem vou comentar o resto...
     
  6. obrigado.

    É sempre bom obter uma resposta como a tua.

    Vicix - Como se vai para Fátima?
    theforbidden - pela A1.
     
  7. hiddenbyte

    hiddenbyte Power Member

    vicix,

    podes fazer usar o seguinte algoritmo(foi feito á pressa , pode ser que tenha alguns bugs:P)

    este é de 0 até 99,


    Código:
     $unidades = new array("zero", "um", "dois", "tres"... ..."dez"... ..., "dezanove");
    $dezenas = new array("vinte", "trinta", ... ..."noventa"); 
    
    $valor = 39,99;
    
    $centimos = ($valor*100) % 100; // resto da divisão inteira do $valor*100 (ou seja centimos)
    $euros = (int)($valor);
    
    if ( $euros < 20) {
        echo "$unidades[$euros] euros";
        if ($centimos < 20) 
                 echo " e $unidades[$centimos] centimos";
        else {
                  echo "e $dezenas[(int)($centimos/10)- 2]";
                  if  (($centimos % 10) > 0)  echo " e $unidades[$centimos%10] ";
                  echo " centimos";
        }
    } else {
                  echo "e $dezenas[(int)($euros/10) - 2]";
                 if  (($euros% 10) > 0)  echo " e $unidades[$euros%10] ";
                 echo " euros";
    
              if ($centimos < 20) 
                 echo " e $unidades[$centimos] centimos";
              else {
                  echo "e $dezenas[(int)($centimos/10)- 2]";
                  if  (($centimos % 10) > 0)  echo " e $unidades[$centimos%10] ";
                  echo " centimos";
              }
    }

    espero que te ajude , resolver o teu problema.
     
  8. obrigadao! :)
    O código que fiz tinha uns pequenos bugs e vi o teu e corriji algumas coisas.
     
  9. SIG

    SIG Power Member

    Olá,

    Como tenho um tempito disponível fiz este. Eu sei que já tens a tua solução mas como era "um problema de algoritmia básico" decidi tentar. Acredita que não é básico se o quiseres fazer mesmo bem feito (digo eu...).

    Nota: Os 17 cêntimos vão aparecer como 16. É o resultado da conta que é feita. Não sei dizer porquê. :P
    Nota2: Só dá até às dezenas de milhares.

    Código:
    <?php
    
    $valor = 17225.17;
    
    echo $valor."<br>";
    
    $centimos = ($valor * 100) % 100;
    $valor = (int)$valor;
    
    $max = 10000;
    
    $unidades = array("16" => "dezasseis", "17" => "dezassete", "15" => "quinze", "1000" => "mil", "100" => "cem", "200" => "duzentos", "300" => "trezentos", "10" => "dez", "20" => "vinte", "30" => "trinta", "1" => "um", "5" => "cinco");
    
    /**
     *    Sempre a dividir por 10 assim obtemos
     *              - dezenas de milhares
     *        - milhares
     *        - centenas
     *        - dezenas
     *
     */
    for($i = $max; $i >= 10; $i /= 10) {    
        if($i == 10000) {
            /**
             *    Nas dezenas de milhares, o principal passará a ser 17 (por exemplo)
             *    Assim na próximo iteração podemos dizer 17 mil
             *
             */
            $principal = (int)($valor / ($i / 10));        
        } else if($i == 1000) {    
            /**
             *    Nos milhares diz-se "não sei quantos mil"
             */
            $principal = (int)($valor / $i);
            echo $unidades["$principal"]." ".$unidades["$i"]." ";            
        } else {    
            $principal = (int)($valor / $i);
        
            /**
             *    quando por exemplo for 3 e estivermos nas centenas
             *    multiplicanto por 100, obtemos o trezentos que corresponde
             *    a uma posição no array
             */                
            $bla = ($i * $principal);    
            echo $unidades["$bla"]." ";
        }
        
        /**
         *    Na primeira iteração o valor será 5321 e depois e aplicada esta conta
         *    passará a ser 321 para assim podermos analizar as centenas
         */
        $valor = $valor % ($principal * $i);
    }
    
    /**
     *    O ciclo for pára nas dezenas mas a conta do $valor é feita na mesma.
     *    Dessa forma, quando se sai do 'for' o conteúdo de valor será o último
     *    dígito.
     */
    echo $unidades["$valor"]." euros e ".$unidades["$centimos"]." cêntimos<br>";
    
    ?>
     
    Última edição pelo moderador: 3 de Abril de 2008
  10. hostmake

    hostmake Power Member

    Vocês complicam a brava!

    Até aos Quatrilioes ou la como se escreve.



    PHP:
    <?php
    $num
    =5433121.53;

    echo 
    $num;
    echo 
    euroExtenso($num);

    function 
    euroExtenso($valor) {

    $singular = array("centimos""euros""mil""milhão""bilião""trilião""quatrilhão");
    $plural = array("centimos""euros""mil""milhões""biliões""triliões""quatrilioes");

    $centenas = array("""cem""duzentos""trezentos""quatrocentos""quinhentos""seiscentos""setecentos""oitocentos""novecentos");

    $dezenas = array("""dez""vinte""trinta""quarenta""cinquenta""sessenta""setenta""oitenta""noventa");

    $dezenas10 = array("dez""onze""doze""treze""quatorze""quinze""dezasseis""dezassete""dezoito""dezanove");

    $unidades = array("""um""dois""três""quatro""cinco""seis""sete""oito""nove");

    $z=0;

    $valor number_format($valor2"."".");
    $inteiro explode("."$valor);
    for(
    $i=0;$i<count($inteiro);$i++)
    for(
    $ii=strlen($inteiro[$i]);$ii<3;$ii++)
    $inteiro[$i] = "0".$inteiro[$i];


    $fim count($inteiro) - ($inteiro[count($inteiro)-1] > 2);
    $rt='';
    for (
    $i=0;$i<count($inteiro);$i++) {
    $valor $inteiro[$i];
    $rc = (($valor 100) && ($valor 200)) ? "cento" $centenas[$valor[0]];
    $rd = ($valor[1] < 2) ? "" $dezenas[$valor[1]];
    $ru = ($valor 0) ? (($valor[1] == 1) ? $dezenas10[$valor[2]] : $unidades[$valor[2]]) : "";

    $r $rc.(($rc && ($rd || $ru)) ? " e " "").$rd.(($rd && $ru) ? " e " "").$ru;
    $t count($inteiro)-1-$i;
    $r .= $r " ".($valor $plural[$t] : $singular[$t]) : "";
    if (
    $valor == "000")$z++; elseif ($z 0$z--;
    if ((
    $t==1) && ($z>0) && ($inteiro[0] > 0)) $r .= (($z>1) ? " de " "").$plural[$t];
    if (
    $r$rt $rt . ((($i 0) && ($i <= $fim) && ($inteiro[0] > 0) && ($z 1)) ? ( ($i $fim) ? ", " " e ") : " ") . $r;
    }

    return(
    $rt $rt "zero");
    }
    ?>
     

Partilhar esta Página