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 instancevar Ajv = require("ajv");var ajv = new Ajv(); // Add the currency keywords to the instancerequire("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"); // trueajv.validate({"currency-en":true},"$-1,234,567.89"); // trueajv.validate({"currency-eu":true},"\u20ac1.234.567,89"); // trueajv.validate({"currency-eu":true},"\u20ac(1.234.567,89)"); // trueajv.validate({"currency-eu":true},"(\u00a51.234.567,89)"); // true ajv.validate({"currency-en":true},"$12,34,567.89"); // falseajv.validate({"currency-en":true},"$-1,234,56789"); // falseajv.validate({"currency-eu":true},"\u20ac1.2345.67,89"); // falseajv.validate({"currency-eu":true},"\u20ac(1.234567,89)"); // falseajv.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"); // trueajv.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"); // trueajv.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 validatorvar weird_ccy_validator = ajv.compile({ "currency":{ "decimal":"v", "separator":"_", "symbol":"\u20ac" // the euro symbol (€) }, }) weird_ccy_validator("\u20ac(1_234_567v89)"); // true: euro symbolweird_ccy_validator("(1_234_567v89)"); // true: currency symbol is not requiredweird_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 formatvar parse_amount = ajv.compile({ type:"object", "properties":{ "amount":{ "currency-en-value":true } }, });var x = {amount:"\u20ac(1,234,567.89)"}parse_amount(x) // truex.amount // -1234567.89 // Coerce (parse) an currency string with a strange formatvar 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); // truex.amount // -1234567.89