@dpkit/table
Version:
Data Package implementation in TypeScript.
66 lines (54 loc) • 2.35 kB
text/typescript
import type { NumberField } from "@dpkit/core"
import { DataType } from "nodejs-polars"
import { col } from "nodejs-polars"
import type { Expr } from "nodejs-polars"
export function parseNumberField(field: NumberField, expr?: Expr) {
expr = expr ?? col(field.name)
// Extract the decimal and group characters
const decimalChar = field.decimalChar ?? "."
const groupChar = field.groupChar ?? ""
const bareNumber = field.bareNumber ?? true
// Handle non-bare numbers (with currency symbols, percent signs, etc.)
if (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
}
export function stringifyNumberField(field: NumberField, expr?: Expr) {
expr = expr ?? col(field.name)
// Convert to string
expr = expr.cast(DataType.String)
//const decimalChar = field.decimalChar ?? "."
//const groupChar = field.groupChar ?? ""
// TODO: Add decimal character formatting when needed
// TODO: Add group character formatting (thousands separator) when needed
// TODO: Add non-bare number formatting (currency symbols, etc.) when needed
return expr
}