import { format as dojoFormatNumber } from "dojo/number"; import { format as dojoFormatDate } from "dojo/date/locale"; import { Formatter, compile as _compile } from "./StringFormat"; import { isNumber, isNull, get } from "../safe"; interface NumberFormatOptions { round?: number; pattern?: string; } function convertNumber(value: any, _pattern?: string) { if (isNumber(value)) { const nopt = {} as NumberFormatOptions; let pattern = _pattern; if (pattern && pattern.indexOf("!") === 0) { nopt.round = -1; pattern = pattern.substr(1); } nopt.pattern = pattern; return dojoFormatNumber(value, nopt); } else { return ""; } } function convertDate(value: any, pattern?: string) { if (value instanceof Date) { const m = pattern && pattern.match(/^(\w+)-(\w+)$/); if (m) return dojoFormatDate(value, { selector: m[2], formatLength: m[1] }); else if (pattern === "iso") return value.toISOString(); else return dojoFormatDate(value, { selector: "date", datePattern: pattern }); } else { return ""; } } const _formatter = new Formatter([convertNumber, convertDate]); function format(msg: string, ...args: any[]) { return _formatter.format(msg, ...args); } function _convert(value: any, pattern?: string) { return _formatter.convert(value, pattern); } namespace format { export const convert = _convert; export function compile(text: string) { const template = _compile(text); return (...data: any[]) => { return template((name, pattern) => { const value = get(name, data); return !isNull(value) ? convert(value, pattern) : ""; }); }; } } export = format;