@dpkit/table
Version:
Data Package implementation in TypeScript.
58 lines (45 loc) • 1.74 kB
text/typescript
import type { IntegerField } from "@dpkit/core"
import { DataType, col, lit, when } from "nodejs-polars"
import type { Expr } from "nodejs-polars"
// TODO: support categories
// TODO: support categoriesOrder
export function parseIntegerField(field: IntegerField, expr?: Expr) {
expr = expr ?? col(field.name)
const groupChar = field.groupChar
const bareNumber = field.bareNumber
const flattenCategories = field.categories?.map(it =>
typeof it === "number" ? it : it.value,
)
// Handle non-bare numbers (with currency symbols, percent signs, etc.)
if (bareNumber === false) {
// Preserve the minus sign when removing leading characters
expr = expr.str.replaceAll("^[^\\d\\-]+", "")
expr = expr.str.replaceAll("[^\\d\\-]+$", "")
}
// Handle group character (thousands separator)
if (groupChar) {
// Escape special characters for regex
const escapedGroupChar = groupChar.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
expr = expr.str.replaceAll(escapedGroupChar, "")
}
// Cast to int64 (will handle values up to 2^63-1)
expr = expr.cast(DataType.Int64)
// Currently, only string categories are supported
if (flattenCategories) {
return when(expr.isIn(flattenCategories))
.then(expr)
.otherwise(lit(null))
.alias(field.name)
}
return expr
}
export function stringifyIntegerField(field: IntegerField, expr?: Expr) {
expr = expr ?? col(field.name)
// Convert to string
expr = expr.cast(DataType.String)
//const groupChar = field.groupChar
//const bareNumber = field.bareNumber
// TODO: Add group character formatting (thousands separator) when needed
// TODO: Add non-bare number formatting (currency symbols, etc.) when needed
return expr
}