@genexus/web-standard-functions
Version:
GeneXus JavaScript standard functions library for web generators
333 lines • 11.9 kB
JavaScript
;
/**
* @param {number} value
* @param {string} picture
* @param {number} dec
* @param {number} len
* @param {string} decSep
* @param {string} thousandSeparator
* @param {boolean} sign
* @param {boolean} errorOnBadNumber
* @return string
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.formatNumber = void 0;
const padRight_1 = require("../text/padRight");
const replace_1 = require("../text/replace");
const numericLenDec = (picture) => {
let decPicturePart = picture.split(".");
let integerPicturePart = decPicturePart.length === 2 ? decPicturePart[0] : picture;
let str_decPicturePart = decPicturePart.length === 2 ? decPicturePart[1] : "";
let integers = (integerPicturePart.match(/9|Z|#|\?|\\/g) || []).length;
let decimals = (str_decPicturePart.match(/9|Z|#|\?|\\/g) || []).length;
return { Integers: integers, Decimals: decimals };
};
const checkPictureCharacter = (char, isDecimal) => {
switch (char) {
case "9":
return "0";
case "Z":
return isDecimal ? "0" : " ";
case "#":
return "";
case "?":
return " ";
}
return "";
};
const checkOverflow = (intL, intPictL) => {
if (intL > intPictL) {
return false;
}
else {
return true;
}
};
const formatNumber = (value, picture, dec, len, decSep, thousandSeparator, sign, errorOnBadNumber) => {
let result = "";
let thSep = picture.indexOf(",") !== -1 ? thousandSeparator : "";
let blankWhenZero = false;
let LenDec = numericLenDec(picture);
let integers = LenDec.Integers;
let decimals = LenDec.Decimals;
if (typeof value == "string") {
if (thSep) {
value = (0, replace_1.replace)(value, thSep, "");
}
value = (0, replace_1.replace)(value, decSep, ".");
}
result = value.toString();
let f = result.split(".");
f[0] = f[0] || "0";
f[1] = f[1] || "";
// checkOverflow
let integerLength = f[0]
.toString()
.split(".")[0]
.replace(/\D/g, "").length;
if (checkOverflow(integerLength, integers) === false) {
return picture
.replaceAll("9", "*")
.replaceAll("Z", "*")
.replaceAll("?", "*")
.replaceAll("#", "*");
}
if (errorOnBadNumber) {
if (f[1].length > decimals && f[1].replace(/0*$/, "").length > decimals) {
throw new Error("InvalidNumber");
}
else {
if ((sign &&
f[0].charAt(0) === "-" &&
f[0].replace(/0*/, "").length > integers) ||
(!sign && f[0].charAt(0) === "-") ||
f[0].replace(/[+]?0*/, "").length > integers) {
throw new Error("InvalidNumber");
}
}
}
let integerInput = f[0].substring(0, integers);
if (Number(value) < 0) {
sign = true;
integerInput = f[0].substring(0, integers + 1);
}
let signChar = "";
let preSignChar = "";
let postSignChar = "";
let dolarSign = picture.indexOf("$") !== -1;
let dolarSignChar = "";
if (dolarSign) {
picture = picture.slice(1);
dolarSignChar = "$";
}
let hasNegativeParentheses = picture.charAt(0) === "(" && picture.charAt(picture.length - 1) === ")";
let hasDebitCreditPrefix = picture.indexOf("DB") !== -1 || picture.indexOf("CR") !== -1;
if (sign) {
if (integerInput.charAt(0) === "-" && !hasNegativeParentheses) {
signChar = "-";
integerInput = integerInput.substring(1);
if (hasDebitCreditPrefix) {
picture = picture.slice(2);
preSignChar = Number(value) < 0 ? "DB" : "CR";
if (signChar === "-") {
if (preSignChar === "CR") {
preSignChar = "DB";
}
signChar = "";
}
else if (signChar === "+") {
signChar = "";
}
else if (signChar === "") {
preSignChar = "CR";
}
}
}
else {
if (picture.charAt(0) === "+") {
if (Number(value) !== 0) {
signChar = "+";
}
if (integerInput.charAt(0) === "+") {
integerInput = integerInput.substring(1);
}
}
if (hasNegativeParentheses) {
picture = picture.substring(1, picture.length - 1);
if (Number(value) < 0) {
integerInput = (Number(integerInput) * -1).toString();
preSignChar = "(";
postSignChar = ")";
}
}
if (hasDebitCreditPrefix) {
picture = picture.slice(2);
preSignChar = Number(value) < 0 ? "DB" : "CR";
if (signChar === "-") {
if (preSignChar === "CR") {
preSignChar = "DB";
}
signChar = "";
}
else if (signChar === "+") {
signChar = "";
}
else if (signChar === "") {
preSignChar = "CR";
}
}
}
}
let picture_split = [];
if (decimals > 0) {
picture_split = picture.split(".");
if (picture_split[1] === (0, padRight_1.padRight)("", decimals, "Z")) {
blankWhenZero = true;
}
}
else {
picture_split = new Array(picture);
if (picture_split.length > 0 &&
picture_split[0].replaceAll(",", "").replaceAll("Z", "").length === 0) {
blankWhenZero = true;
}
}
// parte decimal
let n_idx = 0;
let decPart = "";
let decValue = f[1];
if (picture_split.length > 1) {
let decimal_pic = picture_split[1];
let isEscapedCharacter = false;
for (let i = 0; i < decimal_pic.length; i++) {
let chd = decimal_pic.charAt(i);
if (isEscapedCharacter) {
decPart = decPart + decimal_pic.charAt(i);
}
else if ((chd === "9" || chd === "Z" || chd === "#" || chd === "?") &&
!isEscapedCharacter) {
if (decValue.length > n_idx) {
if (chd === "?" || chd === "#") {
if (decValue.charAt(n_idx) === "0" &&
Number(decValue.substring(n_idx, decValue.length)) === 0) {
if (!(decValue.charAt(n_idx) === "0" && Number(decValue) === 0)) {
decPart = decPart + checkPictureCharacter(chd, true);
}
}
else {
if (decPart.charAt(decPart.length - 1) !== " ") {
decPart = decPart + decValue.charAt(n_idx);
}
}
}
else {
if (decPart.charAt(decPart.length - 1) !== " ") {
decPart = decPart + decValue.charAt(n_idx);
}
}
n_idx++;
}
else {
if (chd === "Z" || chd === "9") {
if (decPart.charAt(decPart.length - 1) !== " ") {
decPart = decPart + checkPictureCharacter(chd, true);
}
}
n_idx++;
}
}
else if (chd === "\\" && isEscapedCharacter) {
decPart = decPart + chd;
isEscapedCharacter = false;
continue;
}
else if (chd !== "." && chd !== "," && !isEscapedCharacter) {
decPart = decPart + chd;
}
isEscapedCharacter = decimal_pic.charAt(i) === "\\";
}
}
// parte entera
let intPart = "";
let epic = picture_split[0];
n_idx = integerInput.replace("-", "").length - 1;
let first_nine = epic.indexOf("9");
first_nine = first_nine === -1 ? epic.length : first_nine;
for (let i = epic.length - 1; i >= 0; i--) {
let ch = epic.charAt(i);
let isEscapedCharacter = false;
if (ch === "Z" && first_nine < i) {
// Ignoring trailing Zs
ch = "9";
}
if (i > 1) {
isEscapedCharacter =
epic.charAt(i - 1) === "\\" && epic.charAt(i - 2) !== "\\";
}
else if (i > 0) {
isEscapedCharacter = epic.charAt(i - 1) === "\\";
}
if (isEscapedCharacter) {
intPart = ch + intPart;
i--;
}
else if ((ch === "9" || ch === "Z" || ch === "#" || ch === "?") &&
!isEscapedCharacter) {
if (n_idx >= 0) {
if (ch === "?" || ch === "#" || ch === "Z") {
if (integerInput.charAt(n_idx) === "0" &&
Number(integerInput.substring(0, n_idx + 1)) === 0) {
if (!(integerInput.charAt(n_idx) === "0" && Number(integerInput) === 0)) {
intPart = checkPictureCharacter(ch, false) + intPart;
}
else {
if (ch === "?" || ch === "Z") {
intPart = checkPictureCharacter(ch, false) + intPart;
}
}
}
else {
if (intPart.charAt(0) !== " ") {
intPart = integerInput.charAt(n_idx) + intPart;
}
}
}
else {
if (intPart.charAt(0) !== " ") {
intPart = integerInput.charAt(n_idx) + intPart;
}
}
n_idx--;
}
else {
if (ch === "9") {
if (intPart.charAt(0) !== " ") {
intPart = checkPictureCharacter(ch, false) + intPart;
}
}
n_idx--;
}
}
else if (ch === "\\" && isEscapedCharacter) {
intPart = ch + intPart;
continue;
}
else if (ch === " ") {
intPart = " " + intPart;
}
else if (ch !== "," && ch !== "+") {
intPart = ch + intPart;
}
else if (ch === "," && integerInput.charAt(n_idx) === thSep) {
intPart = integerInput.charAt(n_idx) + intPart;
n_idx--;
}
}
if (thSep && intPart.replace("(", "").trim().length > 3) {
let h = intPart.replace("(", "").trim();
intPart = "";
for (let j = 3; j < h.length; j += 3) {
let i = h.slice(h.length - j, h.length - j + 3);
intPart = thSep + i + intPart + "";
}
let j = h.substring(0, h.length % 3 === 0 ? 3 : h.length % 3);
intPart = j + intPart;
}
if (blankWhenZero &&
(intPart === "0" || intPart === "") &&
decPart.replace(/0+$/, "").length === 0) {
result = "";
}
else {
result =
signChar +
dolarSignChar +
preSignChar +
intPart +
(!decPart ? "" : decSep + decPart) +
postSignChar;
}
return result;
};
exports.formatNumber = formatNumber;
//# sourceMappingURL=formatNumber.js.map