Quick actions

cmd+k|ctrl+k

Navigation

Languages

Value to portuguese

Snippet info

Language

Raku

Visibility

public

Author

fernando-correa

Created

2022-05-29T02:45:27.633908Z

Updated

2022-05-29T15:25:26.567042Z

multi value-to-portuguese(1) {"um real"}

multi value-to-portuguese(Int $value) {
    "{ .trim } reais" with value-to-portuguese |$value.comb.reverse
}

multi value-to-portuguese(Rat $value) {
    my @cents = ($value % 1 * 100).comb;
    @cents.push: |("0" xx 2 - @cents);
    (
        value-to-portuguese($value.Int).trim,
        |("$_ centavos" with dezena |@cents)
    ).join: " e "
}

multi unidade("0") { Empty }
multi unidade("1") {"um"}
multi unidade("2") {"dois"}
multi unidade("3") {"três"}
multi unidade("4") {"quatro"}
multi unidade("5") {"cinco"}
multi unidade("6") {"seis"}
multi unidade("7") {"sete"}
multi unidade("8") {"oito"}
multi unidade("9") {"nove"}

multi dezena("0", "0") { Empty }
multi dezena("0", $u) { unidade($u) }

multi dezena("1", "0") {"dez"}
multi dezena("1", "1") {"onze"}
multi dezena("1", "2") {"doze"}
multi dezena("1", "3") {"treze"}
multi dezena("1", "4") {"quatorze"}
multi dezena("1", "5") {"quinze"}
multi dezena("1", "6") {"desesseis"}
multi dezena("1", "7") {"desessete"}
multi dezena("1", "8") {"desoito"}
multi dezena("1", "9") {"desenove"}

multi dezena("2", "0") {"vinte"}
multi dezena("3", "0") {"trinta"}
multi dezena("4", "0") {"quarenta"}
multi dezena("5", "0") {"cinquenta"}
multi dezena("6", "0") {"sessenta"}
multi dezena("7", "0") {"setenta"}
multi dezena("8", "0") {"oitenta"}
multi dezena("9", "0") {"noventa"}

multi dezena(Str $d, Str $u) {join " e ", dezena($d,"0"), unidade($u)}

multi centena("0", "0", "0") { Empty }
multi centena("0", $d, $u) { dezena($d, $u) }

multi centena("1", "0", "0") {"cem"}
multi centena("2", "0", "0") {"duzentos"}
multi centena("3", "0", "0") {"trezentos"}
multi centena("4", "0", "0") {"quatrocentos"}
multi centena("5", "0", "0") {"quinhentos"}
multi centena("6", "0", "0") {"seiscentos"}
multi centena("7", "0", "0") {"setecentos"}
multi centena("8", "0", "0") {"oitocentos"}
multi centena("9", "0", "0") {"novecentos"}

multi centena("1", Str $d, Str $u) {join " e ", "cento", dezena($d, $u)}
multi centena(Str $c, Str $d, Str $u) { join " e ", centena($c, "0", "0"), dezena($d, $u)}

multi value-to-portuguese("0") {"zero"}
multi value-to-portuguese("1", *@rest, :mil($) where {.defined && $_ eq "1"}) {
    mil @rest
}
multi value-to-portuguse("1", "0", "0", *@rest, :mil($) where {.defined && $_ eq "1"}) {
    mil @rest
}
sub mil(@rest) {
    (
        value-to-portuguese(|@rest),
        "mil"
    ).join: " "
}
multi value-to-portuguese(:$mil) { Empty }
multi value-to-portuguese("0", "0", "0", *@rest, :$mil = 0) { value-to-portuguese |@rest, :mil($mil + 1) }
multi value-to-portuguese(Str $u, Str $d="0", Str $c="0", *@rest, UInt :$mil = 0) {
    state @mil = "", "mil", <milhão
milhões>, <bilhão bilhões>, <trilhão trilhões>;
    (
        value-to-portuguese(|@rest, :mil($mil+1)),
        "{ 
            centena($c, $d, $u)
        } {
            ($c == $d == 0 && $u == 1) 
            ?? @mil[$mil].head 
            !! @mil[$mil].tail
        }"
    ).join: " "
}

for (0.1, 3.14, 10.98) -> $num {
    say value-to-portuguese($num)
}

for ^1000 -> $num {
    say value-to-portuguese($num)
}
INFO