Number Column

NumberColumn is for integer and float values. It uses the DataTables num type, which sorts numerically rather than lexicographically.

Basic Usage

use Pentiminax\UX\DataTables\Column\NumberColumn;

NumberColumn::new('price', 'Price');
NumberColumn::new('quantity', 'Qty');

Formatted Numbers

When cells contain locale-formatted numbers such as $1,234.56, use formatted() to switch to the num-fmt type, which strips formatting characters before comparing:

NumberColumn::new('revenue', 'Revenue')
    ->formatted();

HTML Content

When cells contain HTML markup wrapping a number, call html() to switch to html-num — DataTables will extract the numeric value from inside the HTML before sorting:

NumberColumn::new('price', 'Price')
    ->html();

Combining html() and formatted() uses html-num-fmt:

NumberColumn::new('revenue', 'Revenue')
    ->html()
    ->formatted();

Custom JS Rendering

Use setRender() to format numbers client-side:

NumberColumn::new('price', 'Price')
    ->setRender('function(data) { return "$" + parseFloat(data).toFixed(2); }');

API Reference

Method Description
`NumberColumn::new(string $name, string $title = '')`Creates a new NumberColumn (type: `num`)
`formatted(bool $formatted = true)`Switches to `num-fmt` type (or `html-num-fmt` when combined with `html()`)
`html(bool $html = true)`Switches to `html-num` type (or `html-num-fmt` when combined with `formatted()`)

Complete Example

use Pentiminax\UX\DataTables\Attribute\AsDataTable;
use Pentiminax\UX\DataTables\Column\NumberColumn;
use Pentiminax\UX\DataTables\Column\TextColumn;
use Pentiminax\UX\DataTables\Model\AbstractDataTable;

#[AsDataTable(Product::class)]
final class ProductsDataTable extends AbstractDataTable
{
    public function configureColumns(): iterable
    {
        yield NumberColumn::new('id', 'ID')->setWidth('60px');
        yield TextColumn::new('name', 'Product');
        yield NumberColumn::new('stock', 'Stock');
        yield NumberColumn::new('price', 'Price')
            ->setRender('function(data) { return "€" + parseFloat(data).toFixed(2); }');
    }

    protected function mapRow(mixed $item): array
    {
        return [
            'id'    => $item->getId(),
            'name'  => $item->getName(),
            'stock' => $item->getStock(),
            'price' => $item->getPrice(),
        ];
    }
}