Propósito

✔ Programação GLOBAL® - Quaisquer soluções e/ou desenvolvimento de aplicações pessoais, ou da empresa, que não constem neste Blog devem ser tratados como consultoria freelance. Queiram contatar-nos: brazilsalesforceeffectiveness@gmail.com | ESTE BLOG NÃO SE RESPONSABILIZA POR QUAISQUER DANOS PROVENIENTES DO USO DOS CÓDIGOS AQUI POSTADOS EM APLICAÇÕES PESSOAIS OU DE TERCEIROS.

POWER BI | Linguagem M: Função de Extenso de Valores Numéricos para Moeda Reais em Português e Dólares Americanos

POWER BI | Linguagem M: Função de Extenso de Valores Numéricos para Moeda em Português


Esta função converte um valor numérico (em reais e centavos) para sua representação por extenso em português, formatando-o corretamente para valores em trilhões, bilhões, milhões, milhares, reais e centavos.


As Vantagens de Usar uma Função do Power Query para Converter Números em Texto com Dólares


Ao trabalhar com dados financeiros em ferramentas como Power BI ou Excel, apresentar números em um formato legível e escrito pode melhorar significativamente relatórios e a experiência do usuário. A função em Power Query (M) foi  aprimorada, oferecendo uma solução robusta para converter valores numéricos em sua forma escrita em Reais, em português do Brasil e em inglês para dólares americanos (por exemplo, 1234.56 se torna "one thousand two hundred thirty-four dollars and fifty-six cents"). Este artigo explora as principais vantagens de usar essa função, tornando-a uma ferramenta valiosa para analistas de dados, contadores e profissionais de negócios que buscam automação e precisão.


1. Maior Legibilidade em Relatórios Financeiros

Uma das principais vantagens dessa função é sua capacidade de transformar números brutos em um formato amigável para humanos. Em relatórios financeiros, onde a clareza é essencial, converter valores em texto por extenso garante que stakeholders — sejam clientes, gestores ou auditores — possam interpretar os valores rapidamente sem erros de leitura. Ao integrar essa função do Power Query ao seu fluxo de trabalho, você automatiza o processo, elimina falhas manuais e economiza tempo, produzindo documentos profissionais como faturas ou balanços otimizados para legibilidade.


2. Suporte Dinâmico para Números Grandes

Diferente de scripts simples com limites fixos, essa função lida dinamicamente com números de qualquer tamanho, desde valores pequenos como 5,25 até cifras enormes como 1 trilhão. Sua abordagem com List.Accumulate e classes predefinidas (trilhões, bilhões, milhões, milhares) garante escalabilidade, sendo ideal para empresas que trabalham com diferentes escalas financeiras. Essa flexibilidade é revolucionária para setores como bancos ou investimentos, onde grandes quantias em dólares são comuns e a precisão na representação escrita é imprescindível.


3. Tratamento Robusto de Erros para Resultados Confiáveis

A integridade dos dados é crucial em aplicações financeiras, e essa função se destaca com seu tratamento de erros integrado. Ela rejeita números negativos e entradas não numéricas com mensagens claras (ex.: "Negative numbers are not supported"), evitando resultados incorretos que poderiam comprometer análises ou relatórios. Para usuários buscando "conversão de números para texto no Power Query" ou "ferramentas confiáveis para dados financeiros", esse recurso aumenta a confiança, garantindo saídas consistentes e precisas.


4. Integração Perfeita com Power BI e Excel

Desenvolvida em Power Query (M), essa função se integra facilmente ao Power BI e ao Excel, duas das ferramentas mais usadas para análise e visualização de dados. Ao incorporá-la ao seu pipeline de transformação de dados, você pode automatizar a conversão de valores em dólares diretamente nos seus fluxos de trabalho, aumentando a eficiência. Essa compatibilidade a torna uma escolha ideal para profissionais pesquisando "ferramentas de relatórios financeiros no Power BI" ou "scripts de automação no Excel".


5. Apresentação Profissional em Inglês com Dólares

Para mercados de língua inglesa, especialmente nos EUA, a saída da função em inglês correto (ex.: "twenty-five dollars and ten cents") está alinhada com práticas padrão de documentação financeira. Isso é particularmente vantajoso para criar documentos legalmente conformes, como contratos ou cheques, onde valores em dólares escritos são exigidos. Seu foco otimizado para "converter números para texto em dólares" ou "conversão de texto financeiro em inglês" atende às necessidades de usuários voltados a padrões empresariais americanos.


6. Economia de Tempo com Automação e Escalabilidade

A conversão manual de números para texto é demorada e propensa a erros, especialmente com grandes conjuntos de dados. Essa função automatiza a tarefa, permitindo processar milhares de registros instantaneamente no Power Query. Seu design modular — com funções auxiliares como ConvertHundreds — também facilita a manutenção ou expansão para outras moedas, oferecendo escalabilidade para necessidades futuras. Para quem busca "automatizar conversão de valores em dólares", essa ferramenta proporciona eficiência e adaptabilidade incomparáveis.


7. Uso Gratuito e Aberto com Atribuição Adequada

Por fim, a política de uso aberto da função (com crédito a Edney Franklin Siqueira) a torna uma solução econômica para indivíduos e organizações. Você pode implementá-la sem custos de licenciamento, desde que reconheça o desenvolvedor original, mesmo após a refatoração que realizei, seguindo práticas éticas de codificação. Essa acessibilidade, combinada com seus recursos poderosos, a posiciona como uma opção destacada para quem pesquisa "scripts gratuitos para Power Query" ou "ferramentas financeiras open-source", agregando valor sem comprometer o orçamento.


Autores:

  • Desenvolvida com o objetivo de ser utilizada em contextos onde a conversão de valores monetários é necessária para apresentação formal (como documentos financeiros).

Funcionalidade:


Recebe um valor numérico e o converte para extenso, incluindo as divisões de trilhões, bilhões, milhões, milhares, reais e centavos, adequando o plural ou singular conforme necessário.

 

  • Exemplo de valor de entrada: 1523.45
  • Exemplo de saída: "mil quinhentos e vinte e três reais e quarenta e cinco centavos"

Redução de Redundância:


Condições repetitivas foram encapsuladas em funções auxiliares para melhorar a legibilidade e a manutenibilidade.

 


Uso de Funções Auxiliares:


Funções auxiliares para a formatação de centenas, dezenas e unidades foram criadas para reduzir a repetição de código.

 


Melhoria na Estrutura de Condições:


As condições foram reestruturadas para melhorar a lógica e evitar repetições desnecessárias.

 


Simplificação de Cálculos:


Cálculos para os valores de trilhões, bilhões, milhões, etc., foram otimizados.

 


Comentários Detalhados:


Adição de comentários detalhados para facilitar a compreensão e manutenção do código.



Versão de inspiração

/*
Função criada por 4devs.com.br.
*/
(valor as number) =>

let
    url = "https://www.4devs.com.br/ferramentas_online.php",
    Source =
    Text.FromBinary(Web.Contents(url, [Headers=[#"Content-Type"="application/x-www-form-urlencoded;charset=UTF-8"], Content=Text.ToBinary("acao=escrever_extenso&unidade=R&txt_valor=" & Text.From(valor) & "&tipo_letra=pr")]))
   
in
    Source

Versão Original

/*
Função criada por Edney Franklin Siqueira e pode ser utilizada desde que citado o desenvolvedor.
*/
(valor as number) => let 
    // Define listas de palavras para números de 0 a 20, dezenas de 20 a 90 e centenas de 100 a 900
    ext_0a20 = {"", " um ", " dois ", " três ", " quatro ", " cinco ", " seis ", " sete ", " oito ", " nove ", " dez ", " onze ", " doze ", " treze ", " quatorze ", " quinze ", " dezesseis ", " dezessete ", " dezoito ", " dezenove ", " vinte "}, 
    ext_20a90 = { " vinte ", " trinta ", " quarenta ", " cinquenta ", " sessenta ", " setenta ", " oitenta ", " noventa "}, 
    ext_100a900 = {"", " cento ", " duzentos ", " trezentos ", " quatrocentos ", " quinhentos ", " seiscentos ", " setecentos ", " oitocentos ", " novecentos " },

    // Extrai e formata a parte decimal (centavos) como string com 3 dígitos, arredondando para 0 casas
    decimal = Text.PadStart( Text.From( Number.Round( (valor - Number.RoundDown(valor,0))*100,0) ) , 3, "0"), 

    // Extrai e formata a parte inteira como string com 15 dígitos, preenchendo com zeros à esquerda
    inteiro = Text.PadStart( Text.From( Number.RoundDown(valor,0) ), 15, "0"), 

    // Concatena parte inteira e decimal para criar um número único com 18 dígitos
    numero = inteiro & decimal, 

    // Converte o número em uma lista de dígitos individuais
    tab_num = Text.ToList(numero), 

    // Calcula valores para cada classe (trilhões, bilhões, milhões, milhares, centenas, centavos) a partir dos dígitos
    trilhao = Number.From( tab_num{00} )*100 + Number.From( tab_num{01} )*10 + Number.From( tab_num{02} ), 
    bilhao = Number.From( tab_num{03} )*100 + Number.From( tab_num{04} )*10 + Number.From( tab_num{05} ), 
    milhao = Number.From( tab_num{06} )*100 + Number.From( tab_num{07} )*10 + Number.From( tab_num{08} ), 
    milhar = Number.From( tab_num{09} )*100 + Number.From( tab_num{10} )*10 + Number.From( tab_num{11} ), 
    centena = Number.From( tab_num{12} )*100 + Number.From( tab_num{13} )*10 + Number.From( tab_num{14} ), 
    centavo = Number.From( tab_num{15} )*100 + Number.From( tab_num{16} )*10 + Number.From( tab_num{17} ), 

    // Define os sufixos das classes, ajustando singular/plural conforme o valor
    classe_tril = if trilhao = 0 then "" else if trilhao = 1 then "trilhão " else "trilhões ", 
    classe_bilh = if bilhao = 0 then "" else if bilhao = 1 then "bilhão " else "bilhões ", 
    classe_milh = if milhao = 0 then "" else if milhao = 1 then "milhão " else "milhões ", 
    classe_mil = if milhar = 0 then "" else "mil ", 
    classe_real = if Number.RoundDown(valor,0) = 0 then "" else if Number.RoundDown(valor,0) = 1 then "real " else if centena+milhar = 0 then "de reais " else "reais ", 
    classe_cent = if centavo = 0 then "" else if centavo = 1 then "centavo " else "centavos ", 

    // Converte trilhões por extenso, considerando faixas (0-20, 20-99, 100+) e exceções como "cem"
    ordem_trilhao = if trilhao <= 20 then ext_0a20{trilhao} & classe_tril 
                    else if trilhao <= 99 then ext_20a90{ ( Number.From( tab_num{01} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{02} )} & classe_tril 
                    else if trilhao = 100 then " Cem " & classe_tril 
                    else if Number.From( tab_num{01} )*10 + Number.From( tab_num{02} ) <= 20 then ext_100a900{ (Number.From( tab_num{00} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{01} )*10 + Number.From( tab_num{02} )} & classe_tril 
                    else ext_100a900{ (Number.From( tab_num{00} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{01} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{02} )} & classe_tril, 

    // Converte bilhões por extenso, seguindo a mesma lógica de trilhões
    ordem_bilhao = if bilhao <= 20 then ext_0a20{bilhao} & classe_bilh 
                   else if bilhao <= 99 then ext_20a90{ ( Number.From( tab_num{04} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{05} )} 
                   else if bilhao = 100 then " Cem " & classe_bilh 
                   else if Number.From( tab_num{04} )*10 + Number.From( tab_num{05} ) <= 20 then ext_100a900{ (Number.From( tab_num{03} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{04} )*10 + Number.From( tab_num{05} )} & classe_bilh 
                   else ext_100a900{ (Number.From( tab_num{03} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{04} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{05} )} & classe_bilh, 

    // Converte milhões por extenso, com lógica similar
    ordem_milhao = if milhao <= 20 then ext_0a20{milhao} & classe_milh 
                   else if milhao <= 99 then ext_20a90{ ( Number.From( tab_num{07} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{08} )} & classe_milh 
                   else if milhao = 100 then " Cem " & classe_milh 
                   else if Number.From( tab_num{07} )*10 + Number.From( tab_num{08} ) <= 20 then ext_100a900{ (Number.From( tab_num{06} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{07} )*10 + Number.From( tab_num{08} )} & classe_milh 
                   else ext_100a900{ (Number.From( tab_num{06} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{07} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{08} )} & classe_milh, 

    // Converte milhares por extenso
    ordem_milhar = if milhar <= 20 then ext_0a20{milhar} & classe_mil 
                   else if milhar <= 99 then ext_20a90{ ( Number.From( tab_num{10} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{11} )} & classe_mil 
                   else if milhar = 100 then " Cem " & classe_mil 
                   else if Number.From( tab_num{10} )*10 + Number.From( tab_num{11} ) <= 20 then ext_100a900{ (Number.From( tab_num{09} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{10} )*10 + Number.From( tab_num{11} )} & classe_mil 
                   else ext_100a900{ (Number.From( tab_num{09} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{10} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{11} )} & classe_mil, 

    // Converte centenas por extenso, incluindo sufixo "real" ou "reais"
    ordem_centena = if centena <= 20 then ext_0a20{centena} & classe_real 
                    else if centena <= 99 then ext_20a90{ ( Number.From( tab_num{13} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{14} )} & classe_real 
                    else if centena = 100 then " Cem " & classe_real 
                    else if Number.From( tab_num{13} )*10 + Number.From( tab_num{14} ) <= 20 then ext_100a900{ (Number.From( tab_num{12} )*100)/100 } & "e" & ext_0a20{Number.From( tab_num{13} )*10 + Number.From( tab_num{14} )} & classe_real 
                    else ext_100a900{ (Number.From( tab_num{12} )*100)/100 } & "e" & ext_20a90{ ( Number.From( tab_num{13} )*10 - 20) /10 } & "e" & ext_0a20{ Number.From( tab_num{14} )} & classe_real, 

    // Converte centavos por extenso
    ordem_centavo = if centavo <= 20 then ext_0a20{centavo} & classe_cent 
                    else ext_20a90{ (Number.From( tab_num{16} )*10-20)/10 } & "e" & ext_0a20{Number.From( tab_num{17} )} & classe_cent, 

    // Define conectores "e" entre as classes, se necessário
    e_trilhao = if trilhao > 0 and bilhao + milhao + milhar + centena + centavo > 0 then " e" else "", 
    e_bilhao = if bilhao > 0 and milhao + milhar + centena + centavo > 0 then " e" else "", 
    e_milhao = if milhao > 0 and milhar + centena + centavo > 0 then " e" else "", 
    e_milhar = if milhar > 0 and centena + centavo > 0 then " e" else "", 
    e_centena = if centena > 0 and centavo > 0 then " e" else "", 

    // Concatena todas as partes para formar o texto final por extenso
    extenso = ordem_trilhao & e_trilhao & ordem_bilhao & e_bilhao & ordem_milhao & e_milhao & ordem_milhar & e_milhar & ordem_centena & e_centena & ordem_centavo
in
    extenso // Retorna o valor por extenso como resultado final

 
Versão Melhorada

 PARAMETRIZADO PARA REAIS 

/*
Função criada por Edney Franklin Siqueira e refatorada por André Bernardes.
Pode ser utilizada livremente desde que citado o desenvolvedor original.
Converte um número em sua representação por extenso em português brasileiro (ex.: 1234.56 -> "mil duzentos e trinta e quatro reais e cinquenta e seis centavos").
Suporta números grandes dinamicamente e trata entradas inválidas.
*/
(valor as any) => let
    // Validação inicial da entrada
    ValorValidado = if Type.Is(Value.Type(valor), type number) then 
                        if valor < 0 then error "Número negativo não suportado" 
                        else valor 
                    else error "Entrada deve ser um número",

    // Define dicionários de palavras para unidades, dezenas e centenas
    ExtensoNumeros = [
        Unidades = {"", "um", "dois", "três", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez", 
                    "onze", "doze", "treze", "quatorze", "quinze", "dezesseis", "dezessete", "dezoito", "dezenove", "vinte"},
        Dezenas = {"", "", "vinte", "trinta", "quarenta", "cinquenta", "sessenta", "setenta", "oitenta", "noventa"},
        Centenas = {"", "cento", "duzentos", "trezentos", "quatrocentos", "quinhentos", "seiscentos", "setecentos", "oitocentos", "novecentos"}
    ],

    // Define classes numéricas e seus sufixos (ordem decrescente de magnitude)
    Classes = {
        [10^12, "trilhão", "trilhões"],  // 1.000.000.000.000
        [10^9,  "bilhão",  "bilhões"],   // 1.000.000.000
        [10^6,  "milhão",  "milhões"],   // 1.000.000
        [10^3,  "mil",     "mil"]        // 1.000 (sem plural)
    },

    // Função auxiliar para converter um número de 0 a 999 em texto
    ConverterCentena = (num as number) as text =>
        let
            cent = Number.RoundDown(num / 100, 0), // Extrai a centena
            resto = Number.Mod(num, 100),          // Calcula o resto (dezenas e unidades)
            dez = Number.RoundDown(resto / 10, 0), // Extrai a dezena
            unid = Number.Mod(resto, 10),          // Extrai a unidade
            textoCentena = if num = 100 then "cem" // Caso especial: "cem" em vez de "cento"
                           else if cent > 0 then ExtensoNumeros[Centenas]{cent} else "",
            textoResto = if resto <= 20 and resto > 0 then ExtensoNumeros[Unidades]{resto} // Usa unidades para 1-20
                         else if resto > 0 then ExtensoNumeros[Dezenas]{dez} & 
                                (if unid > 0 then " e " & ExtensoNumeros[Unidades]{unid} else "") 
                         else "",
            resultado = textoCentena & (if textoCentena <> "" and textoResto <> "" then " e " else "") & textoResto
        in
            resultado,

    // Função auxiliar para aplicar uma classe (ex.: milhões) a um valor
    AplicarClasse = (valorClasse as number, potencia as number, singular as text, plural as text) as text =>
        let
            qtd = Number.RoundDown(valorClasse / potencia, 0), // Calcula a quantidade para a classe
            texto = if qtd = 0 then "" 
                    else ConverterCentena(qtd) & " " & (if qtd = 1 and plural <> "mil" then singular else plural)
        in
            texto,

    // Separa o número em parte inteira e decimal
    Inteiro = Number.RoundDown(ValorValidado, 0),        // Parte inteira
    Decimal = Number.Round((ValorValidado - Inteiro) * 100, 0), // Centavos, arredondado

    // Converte a parte inteira em texto, processando dinamicamente todas as classes
    ProcessarInteiro = let
        Restante = Inteiro, // Valor restante a ser processado
        Partes = List.Accumulate(
            Classes, // Itera sobre as classes definidas
            [ValorRestante = Restante, Texto = {}], // Estado inicial: valor total e lista de textos
            (estado, classe) => let
                potencia = classe{0},    // Potência da classe (ex.: 10^12 para trilhões)
                singular = classe{1},    // Sufixo singular
                plural = classe{2},      // Sufixo plural (ou "mil" sem plural)
                textoClasse = AplicarClasse(estado[ValorRestante], potencia, singular, plural), // Converte a classe
                novoRestante = Number.Mod(estado[ValorRestante], potencia), // Atualiza o restante
                novoTexto = if textoClasse = "" then estado[Texto] else estado[Texto] & {textoClasse} // Adiciona texto se não vazio
            in
                [ValorRestante = novoRestante, Texto = novoTexto]
        ),
        Centena = Number.Mod(Partes[ValorRestante], 1000), // Última centena (0-999)
        TextoCentena = if Centena = 0 and Inteiro > 0 then "" else ConverterCentena(Centena),
        TextoReal = if Inteiro = 0 then "" 
                    else if Inteiro = 1 then " real" 
                    else if Centena = 0 and List.Count(Partes[Texto]) = 0 then " de reais" 
                    else " reais",
        TodasPartes = Partes[Texto] & {if TextoCentena <> "" then TextoCentena & TextoReal else TextoReal}
    in
        TodasPartes,

    // Converte a parte decimal (centavos) em texto
    TextoCentavo = if Decimal = 0 then "" 
                   else ConverterCentena(Decimal) & " " & (if Decimal = 1 then "centavo" else "centavos"),

    // Combina todas as partes não vazias com "e" como separador
    PartesNaoVazias = List.Select(ProcessarInteiro & {TextoCentavo}, each _ <> ""),
    ExtensoFinal = if List.IsEmpty(PartesNaoVazias) then "zero reais" 
                   else Text.Combine(PartesNaoVazias, " e ")
in 

    ExtensoFinal // Retorna o texto final por extenso

 

 PARAMETRIZADO PARA DÓLAR 

 /*

Function created by Edney Franklin Siqueira and refactored by André Bernardes.
May be used freely provided the original developer is credited. Converts a number to its written form in English with dollars (e.g., 1234.56 -> "one thousand two hundred thirty-four dollars and fifty-six cents"). Supports large numbers dynamically and handles invalid inputs. */ (value as any) => let // Initial input validation ValidatedValue = if Type.Is(Value.Type(value), type number) then if value < 0 then error "Negative numbers are not supported" else value else error "Input must be a number", // Define dictionaries for numbers, tens, and hundreds in English NumberWords = [ Units = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty"}, Tens = {"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"}, Hundreds = {"", "one hundred", "two hundred", "three hundred", "four hundred", "five hundred", "six hundred", "seven hundred", "eight hundred", "nine hundred"} ], // Define numeric classes and their suffixes (in descending order of magnitude) Classes = { [10^12, "trillion", "trillions"], // 1,000,000,000,000 [10^9, "billion", "billions"], // 1,000,000,000 [10^6, "million", "millions"], // 1,000,000 [10^3, "thousand", "thousand"] // 1,000 (no plural variation) }, // Helper function to convert a number from 0 to 999 to text ConvertHundreds = (num as number) as text => let hundreds = Number.RoundDown(num / 100, 0), // Extract hundreds remainder = Number.Mod(num, 100), // Calculate remainder (tens and units) tens = Number.RoundDown(remainder / 10, 0), // Extract tens units = Number.Mod(remainder, 10), // Extract units hundredsText = if hundreds > 0 then NumberWords[Hundreds]{hundreds} else "", remainderText = if remainder <= 20 and remainder > 0 then NumberWords[Units]{remainder} // Use units for 1-20 else if remainder > 0 then NumberWords[Tens]{tens} & (if units > 0 then "-" & NumberWords[Units]{units} else "") else "", result = hundredsText & (if hundredsText <> "" and remainderText <> "" then " " else "") & remainderText in result, // Helper function to apply a class (e.g., millions) to a value ApplyClass = (classValue as number, power as number, singular as text, plural as text) as text => let qty = Number.RoundDown(classValue / power, 0), // Calculate quantity for the class text = if qty = 0 then "" else ConvertHundreds(qty) & " " & (if qty = 1 and plural <> "thousand" then singular else plural) in text, // Split the number into integer and decimal parts Integer = Number.RoundDown(ValidatedValue, 0), // Integer part Decimal = Number.Round((ValidatedValue - Integer) * 100, 0), // Cents, rounded // Convert the integer part to text, dynamically processing all classes ProcessInteger = let Remaining = Integer, // Value left to process Parts = List.Accumulate( Classes, // Iterate over defined classes [ValueRemaining = Remaining, Text = {}], // Initial state: full value and empty text list (state, class) => let power = class{0}, // Power of the class (e.g., 10^12 for trillions) singular = class{1}, // Singular suffix plural = class{2}, // Plural suffix (or "thousand" without plural) classText = ApplyClass(state[ValueRemaining], power, singular, plural), // Convert the class newRemaining = Number.Mod(state[ValueRemaining], power), // Update remaining value newText = if classText = "" then state[Text] else state[Text] & {classText} // Add text if not empty in [ValueRemaining = newRemaining, Text = newText] ), Hundreds = Number.Mod(Parts[ValueRemaining], 1000), // Last hundreds (0-999) HundredsText = if Hundreds = 0 and Integer > 0 then "" else ConvertHundreds(Hundreds), DollarText = if Integer = 0 then "" else if Integer = 1 then " dollar" else " dollars", AllParts = Parts[Text] & {if HundredsText <> "" then HundredsText & DollarText else DollarText} in AllParts, // Convert the decimal part (cents) to text CentsText = if Decimal = 0 then "" else ConvertHundreds(Decimal) & " " & (if Decimal = 1 then "cent" else "cents"), // Combine all non-empty parts with "and" as separator NonEmptyParts = List.Select(ProcessInteger & {CentsText}, each _ <> ""), FinalText = if List.IsEmpty(NonEmptyParts) then "zero dollars" else Text.Combine(NonEmptyParts, " and ") in FinalText // Return the final written text

 

Explicação das Melhorias:


Funções Auxiliares: A função calcularExtenso foi criada para processar cada classe (centenas, dezenas e unidades) e retornar o valor correspondente por extenso, eliminando a repetição de lógica. Isso melhora a clareza e a organização do código.

 

Estrutura Lógica Simplificada: A forma como as classes (trilhões, bilhões, milhões, etc.) são montadas foi simplificada, evitando redundância.

 

Formatação Dinâmica: O uso de expressões como Text.Trim garante que o resultado final não contenha espaços extras, mantendo o formato de saída limpo.

 

Legibilidade: A melhoria na estrutura condicional torna o código mais fácil de entender e ajustar para futuras necessidades.


Essa nova versão mantém a funcionalidade original, mas melhora o código em termos de manutenção, legibilidade e eficiência.


Como implementar?

Vá até o editor do Power Query e adicione uma consulta nula:

 













Abra o editor avançado:

 


Apague tudo que tiver escrito no editor:


 







Copie e cole o código dentro da área de trabalho:









Clique em concluído.


Agora conseguirá usar a função personalizada para converter  valores por extenso.

Você pode inserir um número de até 12 dígitos e 2 casas decimais:

Use vírgula para casa decimal: 


Mas você também pode invocar a função para converter os valores de uma tabela por extenso. Basta selecionar a tabela com os valores:

Ir na guia adicionar colunas e escolher Invocar função personalizada



E pronto os numeros estarão por extenso!


The Advantages of Using a Power Query Function to Convert Numbers to Words in Dollars


When working with financial data in tools like Power BI or Excel, presenting numbers in a readable, written format can significantly enhance reports and user experience. The refactored Power Query (M) function, originally created by Edney Franklin Siqueira and enhanced by André Bernardes, offers a robust solution to convert numeric values into their English written form with dollars (e.g., 1234.56 becomes "one thousand two hundred thirty-four dollars and fifty-six cents"). This article explores the key benefits of using this function, making it a valuable tool for data analysts, accountants, and business professionals seeking automation and precision.


1. Enhanced Readability for Financial Reports

One of the primary advantages of this function is its ability to transform raw numbers into a human-friendly format. In financial reporting, where clarity is critical, converting dollar amounts to words ensures that stakeholders—whether clients, managers, or auditors—can quickly interpret values without misreading digits. By integrating this Power Query function into your workflow, you can automate the process, eliminating manual errors and saving time while producing professional-grade documents like invoices or balance sheets optimized for readability.


2. Dynamic Support for Large Numbers

Unlike simpler scripts with fixed limits, this function dynamically handles numbers of any size, from small amounts like $5.25 to massive figures like $1 trillion. Its use of a List.Accumulate approach and predefined classes (trillions, billions, millions, thousands) ensures scalability, making it ideal for businesses dealing with diverse financial scales. This flexibility is a game-changer for industries such as banking or investment, where large dollar amounts are common, and precision in written representation is non-negotiable.


3. Robust Error Handling for Reliable Outputs

Data integrity is paramount in financial applications, and this function excels with its built-in error handling. It rejects negative numbers and non-numeric inputs with clear error messages (e.g., "Negative numbers are not supported"), preventing faulty results that could derail analysis or reporting. For users searching for "Power Query number to text conversion" or "reliable financial data tools," this feature boosts confidence, ensuring consistent and accurate outputs every time.


4. Seamless Integration with Power BI and Excel

Designed in Power Query (M), this function integrates effortlessly with Power BI and Excel, two of the most widely used tools for data analysis and visualization. By embedding it into your data transformation pipeline, you can automate the conversion of dollar amounts directly within your workflows, enhancing efficiency. This compatibility makes it a top choice for professionals looking to streamline processes, as evidenced by its applicability in queries like "Power BI financial reporting tools" or "Excel automation scripts."


5. Professional Presentation in English with Dollars

For English-speaking markets, particularly in the U.S., the function’s output in proper English (e.g., "twenty-five dollars and ten cents") aligns with standard financial documentation practices. This is especially advantageous for creating legally compliant documents like contracts or checks, where written dollar amounts are required. Its SEO-friendly focus on "convert numbers to words in dollars" or "English financial text conversion" ensures it meets the needs of users targeting American business standards.


6. Time-Saving Automation and Scalability

Manual conversion of numbers to text is tedious and error-prone, especially with large datasets. This function automates the task, allowing users to process thousands of records instantly within Power Query. Its modular design—featuring helper functions like ConvertHundreds—also makes it easy to maintain or extend for other currencies, offering scalability for future needs. For those searching "automate dollar amount text conversion," this tool delivers unmatched efficiency and adaptability.


7. Free and Open Usage with Proper Attribution

Finally, the function’s open usage policy (credit to Edney Franklin Siqueira) makes it a cost-effective solution for individuals and organizations. You can implement it without licensing fees, provided you acknowledge the original developer, aligning with ethical coding practices. This accessibility, combined with its powerful features, positions it as a standout option for anyone researching "free Power Query scripts" or "open-source financial tools," driving value without breaking the budget.


👉 Não se esqueça de seguir André Bernardes no Linkedin. Clique aqui e me contate via What's App. 

Comente e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com

Integrando Microsoft Fabric com Azure: Dicas e Melhores Práticas | Integrating Microsoft Fabric with Azure: Tips and Best Practices

Integrando Microsoft Fabric com Azure: Dicas e Melhores Práticas | Integrating Microsoft Fabric with Azure: Tips and Best Practices

#MicrosoftFabric #PowerBI #BigData #DataAnalytics #CloudComputing #BusinessIntelligence #MicrosoftAzure #DataScience #RealTimeAnalytics


Se você trabalha com dados, já deve ter se perguntado: devo usar Microsoft Fabric ou Power BI? Embora ambos sejam poderosas ferramentas de análise, cada um tem seus pontos fortes e fraquezas. Vamos explorar as diferenças e entender qual é a melhor opção para suas necessidades!


1. O Que é o Microsoft Fabric? 🔥

O Microsoft Fabric é uma plataforma unificada para engenharia de dados, BI, IA e armazenamento, baseada no OneLake. Ele vai além da visualização, oferecendo capacidades robustas de gestão e processamento de dados.


2. O Que é o Power BI? 📊

O Power BI é uma ferramenta de visualização e relatórios interativos. Ele é ideal para transformar dados em insights visualmente impactantes, sendo amplamente utilizado para dashboards e relatórios empresariais.


3. Armazenamento de Dados: OneLake vs. Data Model 🏗️

O Fabric utiliza OneLake, um data lake centralizado. Já o Power BI trabalha com Data Model, otimizando relatórios com um repositório específico para visualização.


4. Capacidade de Processamento 🚀

O Fabric conta com processamento distribuído via Apache Spark, permitindo manipulação de grandes volumes de dados. O Power BI é mais limitado em processamento, focado em consultas otimizadas para dashboards.


5. Qual é Melhor para Big Data? 📡

Se você trabalha com Big Data, o Fabric é a escolha ideal, pois suporta ETL pesado e análise de grandes conjuntos de dados. O Power BI é melhor para relatórios gerenciais.


6. Integração com Outras Ferramentas 🔄

Ambos se integram ao Azure, mas o Fabric é mais completo para workloads complexos. O Power BI brilha quando conectado a diversas fontes de dados empresariais.


7. Facilidade de Uso 🖱️

O Power BI é mais amigável para usuários sem conhecimento técnico. O Fabric requer experiência com análise de dados e engenharia de dados.


8. Automatisse Relatórios e Dashboards 📑

Se seu foco é automação de relatórios, o Power BI é a escolha certa. Já se você precisa processar dados em grande escala, o Fabric é mais indicado.


9. Performance e Escalabilidade

O Fabric tem uma abordagem escalável por padrão, enquanto o Power BI pode encontrar limitações de performance em cenários muito grandes.


10. Segurança e Governança 🔐

Ambos possuem forte governança, mas o Fabric é mais robusto para grandes corporações que precisam de controle granular sobre os dados.


11. Implementação e Custos 💰

O Power BI é mais barato e rápido de implementar. O Fabric é um investimento maior, mas essencial para workloads complexos.


12. Quando Escolher o Power BI?

Se você precisa de relatórios rápidos, dashboards interativos e fácil integração com fontes de dados empresariais, o Power BI é a melhor opção.


13. Quando Escolher o Microsoft Fabric? 🏆

Se você lida com grandes volumes de dados, workflows de ETL complexos e precisa de análise de alto desempenho, o Fabric é a escolha certa.


14. Concorrentes ou Complementares? 🔄

O ideal é usar ambos! O Fabric pode ser o backend, processando e armazenando dados, enquanto o Power BI gera relatórios dinâmicos para os usuários finais.


15. O Futuro da Análise de Dados na Microsoft 🚀

Com a evolução do Microsoft Fabric, é provável que o Power BI se torne cada vez mais integrado a essa plataforma, trazendo um ecossistema ainda mais poderoso para análise de dados.


👉 Não se esqueça de seguir André Bernardes no Linkedin. Clique aqui e me contate via What's App. 

Comente e compartilhe este artigo!

brazilsalesforceeffectiveness@gmail.com


 Série de Livros nut Project 

DONUT PROJECT: VBA - Projetos e Códigos de Visual Basic for Applications (Visual Basic For Apllication)eBook - DONUT PROJECT 2024 - Volume 03 - Funções Financeiras - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 02 - Conectando Banco de Dados - André Luiz Bernardes eBook - DONUT PROJECT 2024 - Volume 01 - André Luiz Bernardes
diHITT - Notícias