UNPKG

@dpkit/table

Version:

Data Package implementation in TypeScript.

41 lines 6.6 kB
import { DataType } from "nodejs-polars"; import { col } from "nodejs-polars"; export function parseNumberField(field, expr) { expr = expr ?? col(field.name); // Extract the decimal and group characters const decimalChar = field.decimalChar || "."; const groupChar = field.groupChar || ""; // Handle non-bare numbers (with currency symbols, percent signs, etc.) if (field.bareNumber === false) { // Remove leading non-digit characters (except minus sign and allowed decimal points) const allowedDecimalChars = decimalChar === "." ? "\\." : `\\.${decimalChar}`; expr = expr.str.replaceAll(`^[^\\d\\-${allowedDecimalChars}]+`, ""); // Remove trailing non-digit characters expr = expr.str.replaceAll(`[^\\d${allowedDecimalChars}]+$`, ""); } // Special case handling for European number format where "." is group and "," is decimal if (groupChar === "." && decimalChar === ",") { // First temporarily replace the decimal comma with a placeholder expr = expr.str.replaceAll(",", "###DECIMAL###"); // Remove the group dots expr = expr.str.replaceAll("\\.", ""); // Replace the placeholder with an actual decimal point expr = expr.str.replaceAll("###DECIMAL###", "."); } else { // Standard case: first remove group characters if (groupChar) { // Escape special characters for regex const escapedGroupChar = groupChar.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); expr = expr.str.replaceAll(escapedGroupChar, ""); } // Then handle decimal character if (decimalChar && decimalChar !== ".") { expr = expr.str.replaceAll(decimalChar, "."); } } // Cast to float64 expr = expr.cast(DataType.Float64); return expr; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZmllbGQvdHlwZXMvbnVtYmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGVBQWUsQ0FBQTtBQUduQyxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsS0FBa0IsRUFBRSxJQUFXO0lBQzlELElBQUksR0FBRyxJQUFJLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUU5QiwyQ0FBMkM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDLFdBQVcsSUFBSSxHQUFHLENBQUE7SUFDNUMsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUE7SUFFdkMsdUVBQXVFO0lBQ3ZFLElBQUksS0FBSyxDQUFDLFVBQVUsS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUMvQixxRkFBcUY7UUFDckYsTUFBTSxtQkFBbUIsR0FDdkIsV0FBVyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLFdBQVcsRUFBRSxDQUFBO1FBQ25ELElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxZQUFZLG1CQUFtQixJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDbkUsdUNBQXVDO1FBQ3ZDLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLG1CQUFtQixLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7SUFDbEUsQ0FBQztJQUVELHlGQUF5RjtJQUN6RixJQUFJLFNBQVMsS0FBSyxHQUFHLElBQUksV0FBVyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzdDLGlFQUFpRTtRQUNqRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBQ2hELHdCQUF3QjtRQUN4QixJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBQ3JDLHVEQUF1RDtRQUN2RCxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQ2xELENBQUM7U0FBTSxDQUFDO1FBQ04sK0NBQStDO1FBQy9DLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxzQ0FBc0M7WUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFBO1lBQ3pFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQTtRQUNsRCxDQUFDO1FBRUQsZ0NBQWdDO1FBQ2hDLElBQUksV0FBVyxJQUFJLFdBQVcsS0FBSyxHQUFHLEVBQUUsQ0FBQztZQUN2QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxDQUFBO1FBQzlDLENBQUM7SUFDSCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUNsQyxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IE51bWJlckZpZWxkIH0gZnJvbSBcIkBkcGtpdC9jb3JlXCJcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHsgY29sIH0gZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuaW1wb3J0IHR5cGUgeyBFeHByIH0gZnJvbSBcIm5vZGVqcy1wb2xhcnNcIlxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VOdW1iZXJGaWVsZChmaWVsZDogTnVtYmVyRmllbGQsIGV4cHI/OiBFeHByKSB7XG4gIGV4cHIgPSBleHByID8/IGNvbChmaWVsZC5uYW1lKVxuXG4gIC8vIEV4dHJhY3QgdGhlIGRlY2ltYWwgYW5kIGdyb3VwIGNoYXJhY3RlcnNcbiAgY29uc3QgZGVjaW1hbENoYXIgPSBmaWVsZC5kZWNpbWFsQ2hhciB8fCBcIi5cIlxuICBjb25zdCBncm91cENoYXIgPSBmaWVsZC5ncm91cENoYXIgfHwgXCJcIlxuXG4gIC8vIEhhbmRsZSBub24tYmFyZSBudW1iZXJzICh3aXRoIGN1cnJlbmN5IHN5bWJvbHMsIHBlcmNlbnQgc2lnbnMsIGV0Yy4pXG4gIGlmIChmaWVsZC5iYXJlTnVtYmVyID09PSBmYWxzZSkge1xuICAgIC8vIFJlbW92ZSBsZWFkaW5nIG5vbi1kaWdpdCBjaGFyYWN0ZXJzIChleGNlcHQgbWludXMgc2lnbiBhbmQgYWxsb3dlZCBkZWNpbWFsIHBvaW50cylcbiAgICBjb25zdCBhbGxvd2VkRGVjaW1hbENoYXJzID1cbiAgICAgIGRlY2ltYWxDaGFyID09PSBcIi5cIiA/IFwiXFxcXC5cIiA6IGBcXFxcLiR7ZGVjaW1hbENoYXJ9YFxuICAgIGV4cHIgPSBleHByLnN0ci5yZXBsYWNlQWxsKGBeW15cXFxcZFxcXFwtJHthbGxvd2VkRGVjaW1hbENoYXJzfV0rYCwgXCJcIilcbiAgICAvLyBSZW1vdmUgdHJhaWxpbmcgbm9uLWRpZ2l0IGNoYXJhY3RlcnNcbiAgICBleHByID0gZXhwci5zdHIucmVwbGFjZUFsbChgW15cXFxcZCR7YWxsb3dlZERlY2ltYWxDaGFyc31dKyRgLCBcIlwiKVxuICB9XG5cbiAgLy8gU3BlY2lhbCBjYXNlIGhhbmRsaW5nIGZvciBFdXJvcGVhbiBudW1iZXIgZm9ybWF0IHdoZXJlIFwiLlwiIGlzIGdyb3VwIGFuZCBcIixcIiBpcyBkZWNpbWFsXG4gIGlmIChncm91cENoYXIgPT09IFwiLlwiICYmIGRlY2ltYWxDaGFyID09PSBcIixcIikge1xuICAgIC8vIEZpcnN0IHRlbXBvcmFyaWx5IHJlcGxhY2UgdGhlIGRlY2ltYWwgY29tbWEgd2l0aCBhIHBsYWNlaG9sZGVyXG4gICAgZXhwciA9IGV4cHIuc3RyLnJlcGxhY2VBbGwoXCIsXCIsIFwiIyMjREVDSU1BTCMjI1wiKVxuICAgIC8vIFJlbW92ZSB0aGUgZ3JvdXAgZG90c1xuICAgIGV4cHIgPSBleHByLnN0ci5yZXBsYWNlQWxsKFwiXFxcXC5cIiwgXCJcIilcbiAgICAvLyBSZXBsYWNlIHRoZSBwbGFjZWhvbGRlciB3aXRoIGFuIGFjdHVhbCBkZWNpbWFsIHBvaW50XG4gICAgZXhwciA9IGV4cHIuc3RyLnJlcGxhY2VBbGwoXCIjIyNERUNJTUFMIyMjXCIsIFwiLlwiKVxuICB9IGVsc2Uge1xuICAgIC8vIFN0YW5kYXJkIGNhc2U6IGZpcnN0IHJlbW92ZSBncm91cCBjaGFyYWN0ZXJzXG4gICAgaWYgKGdyb3VwQ2hhcikge1xuICAgICAgLy8gRXNjYXBlIHNwZWNpYWwgY2hhcmFjdGVycyBmb3IgcmVnZXhcbiAgICAgIGNvbnN0IGVzY2FwZWRHcm91cENoYXIgPSBncm91cENoYXIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpXG4gICAgICBleHByID0gZXhwci5zdHIucmVwbGFjZUFsbChlc2NhcGVkR3JvdXBDaGFyLCBcIlwiKVxuICAgIH1cblxuICAgIC8vIFRoZW4gaGFuZGxlIGRlY2ltYWwgY2hhcmFjdGVyXG4gICAgaWYgKGRlY2ltYWxDaGFyICYmIGRlY2ltYWxDaGFyICE9PSBcIi5cIikge1xuICAgICAgZXhwciA9IGV4cHIuc3RyLnJlcGxhY2VBbGwoZGVjaW1hbENoYXIsIFwiLlwiKVxuICAgIH1cbiAgfVxuXG4gIC8vIENhc3QgdG8gZmxvYXQ2NFxuICBleHByID0gZXhwci5jYXN0KERhdGFUeXBlLkZsb2F0NjQpXG4gIHJldHVybiBleHByXG59XG4iXX0=