npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@logicamente.info/mongoose-currency-brl

v1.0.1

Published

Adiciona o tipo 'BrazilianCurrency' ao mongoose para tratar dinheiro. Remove caracteres comuns automaticamente (',', 'R$' e letras do alfabeto).

Downloads

4

Readme

Mongoose-Currency-BRL

Travis npm package

Menção honrosa a @paulcsmith por disponibilizar o repositório original que tornou este pacote possível.

O que isto faz

  • Salva uma String como Integer (remove não dígitos e multiplica por 100) para prevenir erros de arredondamento ao realizar cálculos (Ver "Sacadas" para detalhes)
  • Remove símbolos da string (como símbolo da moeda $ ou R$)
  • Remove pontos (e.g. "1.000,50" => 100050)
  • Salva apenas os dois primeiros digitos da parte decimal ("R$ 500,559" é convertido para 50055 e não arredonda)
  • Remove [a-zA-Z] das strings
  • Aceita strings e números. Número serão armazenados tal como informado.
  • Se um ponto flutuante for passado, ele será arredondado. (500.55 => 501). Use apenas inteiros ou strings por segurança.

Como usar

import mongoose from "mongoose";
import { BrazilianCurrency } from "@logicamente.info/mongoose-currency-brl";

// Adicione o tipo BrazilianCurrency ao Mongoose (necessário uma única vez, sugestão: coloque no arquivo de criação da conexão)
BrazilianCurrency.loadType(mongoose);

const ProdutoSchema = Schema({
  preco: { type: BrazilianCurrency }
});

const Produto = mongoose.model('Produto', ProdutoSchema);

const produto = new Produto({ preco: "R$ 1.200,55" });
produto.preco; // Número: 120055
produto.preco = 1200;
produto.preco; // Número 1200 não irá arredondar ou multiplicar e deve representar R$ 12,00

Schema options

Aceita o esquema de opções de números do mongoose.

// Irá validar se o mínimo é R$ 200,00 e o máximo é R$ 500,00
var ProdutoSchema = Schema({
  preco: { type: BrazilianCurrency, required: true, min: -20000, max: 50000 }
});

Exibindo para usuários finais (telas, relatórios, etc.)

Para exibir os valores aos usuários finais, lembre-se de dividir por 100, e na sequência você pode mascarar o resultado.

// Se produto.preco = 120055
const preco = produto.preco / 100; // Retorna 1200.55
const opcoes = { style: 'currency', currency: 'BRL' };
Intl.NumberFormat('pt-BR', opcoes).format(preco); // Retorna R$ 1.200,55

Testando

Na raiz do diretório do projeto, execute npm test

Sacadas

O valor é armazenado e retornado como um inteiro. Por que? Porque somar dois pontos flutuantes pode causar erros de arredondamento.

// Isso não é bom
1.03 + 1.19; // 2.2199999999999998

Cálculos com valores usando mongoose-currency-brl

const produto1 = Produto.findById('id1');
const produto2 = Produto.findById('id2');
produto1.preco; // retorna 103 que representa R$ 1,03
produto2.preco; // retorna 119 que representa R$ 1,19
const soma = (produto1.preco + produto2.preco) / 100; // = 222
soma / 100; // retorna um número decimal: 2.22

Exibindo valores para usuários finais

const opcoes = { style: 'currency', currency: 'BRL' };
const registro = Produto.findById('id');
registro.preco; // Supondo 10050
Intl.NumberFormat('pt-BR', opcoes).format(preco); // R$ 100,50

Quando você atribui um inteiro, ele NÃO será multiplicado por 100. Será armazenado tal como é! Isto é de propósito, pois esta biblioteca foi criada principalmente para aceitar entradas realizadas por USUÁRIOS.

produto.preco = 100;
produto.preco; // Retorna 100 e não multiplica por 100. Representa R$ 1,00

Consultas e validadores

Lembre-se que ao fazer consultas para encontrar valores maiores que, menores que, etc. você precisará multiplicar por 100!

Então para retornar valores maiores que R$ 100,00 você precisará realizar a consulta com 100 * 100 e.g. 10000

Esta é considerada uma boa prática para armazenar valores monetários como inteiros. Causará muito menos problemas pelo caminhho

Para uma leitura mais aprofundada: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

Apenas lembre-se dividir por 100 toda vez que você quiser exibir os valores para o usuário.