#' Numeros por extenso
#'
#' Converte os valores numericos em seu equivalente por escrito
#' @param numero_pre e o numero a ser inserido, que pode ser decimal, separado por "."
#' @param moeda, boolean, em caso de verdaderio o valor sera considerado monetario
#' @return O numero por extenso
#' @examples
#' extenso1 <- extenso(50);
#' extenso2 <- extenso(50, TRUE);
#' @export
extenso <- function(numero_pre, moeda){
excessoes <- data.frame(
num = c(0,11:19),
nome = c("zero","onze", "doze", "treze", "catorze", "quinze", "dezesseis", "dezessete", "dezoito", "dezenove"),
stringsAsFactors = F
)
numeros <- data.frame(
num = c(0,1:9),
unidade = c(NA,"um", "dois", "tres", "quatro", "cinco", "seis", "sete", "oito", "nove"),
dezena = c(NA,"dez", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"),
centena = c(NA,"cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos"),
stringsAsFactors = F
)
if(stringr::str_detect(numero_pre, "[.]")){
decimal <- stringr::str_extract(numero_pre, "[^.]*$")
if(nchar(decimal) < 2){
decimal <- paste0(decimal, "0")
}
numero <- stringr::str_extract(numero_pre, ".*(?=[.])")
}else{
decimal <- NA
numero <- numero_pre
}
tamanho_numero <- stringr::str_length(numero)
if(tamanho_numero > 18){
print("Número fora do alcance: Limite 999 quatrilhões")
}else{
posicao_vetor <- unlist(stringr::str_split(numero, ""))
nomes_numeros_pre <- c()
nome_numero<- c()
nomes_numeros <- c()
rodada <- tamanho_numero
nome_numeros_interno <- function(vetor_atual, excessoes, numeros){
tamanho_numero_atual <- length(vetor_atual)
for (coluna in 1:tamanho_numero_atual) {
teste_vetor <- as.numeric(paste(rev(vetor_atual), collapse = ""))
vetor_exc <- ifelse(nchar(teste_vetor) < 3 , teste_vetor,substr(teste_vetor,2,3))
vetor_resto <- ifelse(nchar(teste_vetor) < 3 , NA, substr(teste_vetor, 1,1))
if(vetor_exc %in% excessoes$num){
nome_numero[1]<- excessoes$nome[excessoes$num == vetor_exc]
nome_numero[2]<- ifelse(is.na(vetor_resto), NA, numeros[,c(1,4)][numeros$num == vetor_resto,2])
}else{
numero_vez <- vetor_atual[coluna]
print_vez <- numeros[,c(1,coluna + 1)]
nome_numero[coluna] <- print_vez[print_vez$num == numero_vez,2]
}
}
return(nome_numero)
}
decima_functionl <- function(decimal, excessoes, numeros){
if(is.na(decimal)){
nome_decimal<-NA
}else{
tamanho_numero <- stringr::str_length(decimal)
posicao_vetor <- unlist(stringr::str_split(stringi::stri_reverse(decimal), ""))
nome_decimal<- nome_numeros_interno(posicao_vetor, excessoes, numeros)
}
return(nome_decimal)
}
nomes_decimal <- decima_functionl(decimal, excessoes, numeros)
numeros_concat <- function(nomes_numeros_pre){
nomes_numeros_pos <- nomes_numeros_pre[!is.na(nomes_numeros_pre)]
if(length(nomes_numeros_pos)>1){
nome_numero <- paste(rev(nomes_numeros_pos), collapse = " e ")
}else{
nome_numero <-nomes_numeros_pos
}
return(nome_numero)
}
for (i in 1:ceiling(tamanho_numero/3)) {
inicio <-rodada
final <- ifelse(inicio-(2) < 1, 1, inicio-(2))
vetor_atual <- posicao_vetor[inicio:final]
teste_vetor <- vetor_atual
rodada <- final - 1
nomes_numeros[[i]] <- numeros_concat(nome_numeros_interno(vetor_atual, excessoes, numeros))
}
if (!is.na(decimal)){
nomes_decimal <- numeros_concat(nomes_decimal)
}
tabela_nomes_completos <- as.data.frame(nomes_numeros) |>
tidyr::pivot_longer(cols = everything(), names_to = "numeros")|>
dplyr::rename("nomes" = 1) |>
dplyr::mutate("ID" = dplyr::row_number()) |>
dplyr::mutate("qualificador" = dplyr::case_when(ID == 1 ~ "",
ID == 2 ~ "mil",
ID == 3 & value != "um" ~ "milhões",
ID == 3 & value == "um" ~ "milhão",
ID == 4 & value != "um" ~ "bilhões",
ID == 4 & value == "um" ~ "bilhão",
ID == 5 & value != "um" ~ "trilhões",
ID == 5 & value == "um" ~ "trilhão",
ID == 6 & value != "um" ~ "quatrilhões",
ID == 6 & value == "um" ~ "quatrilhão"))|>
dplyr::mutate(nome_completo = paste0(value, sep = " ", qualificador))|>
dplyr::select(nome_completo)
resposta_final<- paste(rev(tabela_nomes_completos$nome_completo), collapse = " ")
if(moeda == TRUE){
if(is.na(decimal)){
resposta_final <- paste0(resposta_final, "reais ")
}else{
resposta_final <- paste0(resposta_final, "reais e ", nomes_decimal, " centavos")
}
}else{
if(is.na(decimal)){
resposta_final <- paste0(resposta_final)
}else{
resposta_final <- paste0(resposta_final, " vírgula ", nomes_decimal)
}
}
return(resposta_final)
}
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.