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

ajv-currency

v1.0.1

Published

A currency validator / parser for ajv with the keyword "currency" (and friends)

Downloads

433

Readme

Currency string validation and parsing for AJV

This module exports a single function which adds the currency validation keywords 'currency-en', 'currency-eu', and 'currency' and the currency parsing keywords 'currency-en-value', 'currency-eu-value', and 'currency-value' to Ajv instance, like so:

// Create an ajv instance
var Ajv = require("ajv");
var ajv = new Ajv();

// Add the currency keywords to the instance
require("ajv-currency")(ajv);

Validation

With the keywords added to out ajv instance, English (-en) and European (-eu) style strings can be validated like so:

ajv.validate({"currency-en":true},"$1,234,567.89");        // true
ajv.validate({"currency-en":true},"$-1,234,567.89");       // true
ajv.validate({"currency-eu":true},"\u20ac1.234.567,89");   // true
ajv.validate({"currency-eu":true},"\u20ac(1.234.567,89)"); // true
ajv.validate({"currency-eu":true},"(\u00a51.234.567,89)"); // true

ajv.validate({"currency-en":true},"$12,34,567.89");       // false
ajv.validate({"currency-en":true},"$-1,234,56789");       // false
ajv.validate({"currency-eu":true},"\u20ac1.2345.67,89");  // false
ajv.validate({"currency-eu":true},"\u20ac(1.234567,89)"); // false
ajv.validate({"currency-eu":true},"(\u00a51234.567,89)"); // false

Alternatively, the decimal, separator, and (optionally) the symbol may be specified with the keyword "currency" like so:

ajv.validate({"currency":{"separator":",","decimal":"."}},"$1,234,567.89"); // true
ajv.validate({"currency":{"separator":".","decimal":","}},"$1.234.567,89"); // true

and defaults for decimal, separator, and currency may be specified when loading the plug in:

var ajv = new Ajv();
require("ajv-currency")(ajv,{"separator":",","decimal":"."}); // same as the default

ajv.validate({"currency":true},"$1,234,567.89"); // true
ajv.validate({"currency":true},"$1.234.567,89"); // false

// Defaults can be overridden in the schema:
ajv.validate({"currency":{"separator":".","decimal":","}},"$1.234.567,89"); // true

The extended (perl style) regular expressions library xregexp is used rather than JavaScript's Regular Expressions to take advantage of the included unicode currency range item (\p{Sc}), and by default, the any of the Unicode currency symbols may appear at the start of the number string.

// Create a custom validator
var weird_ccy_validator = 
	ajv.compile({ 
		"currency":{
		   	"decimal":"v",
			"separator":"_",
			"symbol":"\u20ac" // the euro symbol (€) 
		},
	})

weird_ccy_validator("\u20ac(1_234_567v89)"); // true: euro symbol
weird_ccy_validator("(1_234_567v89)");       // true: currency symbol is not required
weird_ccy_validator("$(1_234_567v89)");      // false: wrong currency symbol

String Parsing

In addition to validation, string to attributes can be parsed and replaced with the numeric value, using any of the -value keywords, like so:

// Coerce (parse) an currency string in the English format
var parse_amount = 
	ajv.compile({ 
		type:"object",
		"properties":{
			"amount":{
				"currency-en-value":true
			}
		},
	});
var x = {amount:"\u20ac(1,234,567.89)"}
parse_amount(x) // true
x.amount // -1234567.89

// Coerce (parse) an currency string with a strange format
var parse_weird_amount = 
	ajv.compile({ 
		"properties":{ 
			"amount":{
				"currency-value":{
					"decimal":"v",
					"separator":"_",
					"symbol":"\u20ac" // Optional: see note above.
				}
			}
		},
	})

var x = {amount:"\u20ac(1_234_567v89)"}
parse_weird_amount(x); // true
x.amount // -1234567.89