Para formatear cifras con formato americano (por ejemplo, 1,000.00, 10,000.00, 100,000.00) en el componente ReactGrid, la solución recomendada es usar la API Intl.NumberFormat para formatear los números en las celdas.
En ReactGrid, esto se puede hacer creando un template o un render personalizado para las celdas numéricas que formateen los valores con Intl.NumberFormat usando la configuración regional ‘en-US’ y formato numérico con separadores de miles y dos decimales.
Un ejemplo de código en React para formatear números con formato americano en ReactGrid sería este:
import React from "react"; import { NumberCell } from "@silevis/reactgrid"; const AmericanNumberCell = (props) => { const { value } = props; // Usar Intl.NumberFormat para formato americano (miles con coma y dos decimales) const formattedValue = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value); return ( <NumberCell {...props} value={formattedValue} /> ); }; // Ejemplo de uso dentro de columnas o celdas de ReactGrid: const columns = [ { columnId: "price", header: "Price", cellType: AmericanNumberCell } ]; // Más configuración de ReactGrid aquí...
Este componente personalizado AmericanNumberCell formatea el valor numérico con separadores de miles y dos dígitos decimales utilizando la localización americana, asegurando que las cifras se vean como 1,000.00, 10,000.00, etc.
Se debe reemplazar el uso estándar de celdas numéricas en ReactGrid por este template personalizado para las columnas o celdas donde se desee este formato.
Esta es la forma estándar y recomendada porque ReactGrid permite proporcionar templates personalizados para celdas numéricas usando Intl.NumberFormat para controlar el formato numérico.
Aquí está un ejemplo completo de cómo usar ReactGrid para mostrar números con formato americano (1,000.00, 10,000.00, etc.) usando un componente personalizado que formatea con Intl.NumberFormat:
import React, { useState } from "react"; import { ReactGrid, NumberCell, EditCellProps, CellBase, CellChange, Row, Column } from "@silevis/reactgrid"; // Componente personalizado para formatear número estilo americano const AmericanNumberCell = ({ value, columnId, rowId, onCellChanged }) => { // Formatear valor con separadores de miles y dos decimales const formattedValue = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value); return ( <NumberCell value={formattedValue} columnId={columnId} rowId={rowId} onCellChanged={onCellChanged} /> ); }; const App = () => { // Datos iniciales con números const [cells, setCells] = useState([ [{ type: "text", text: "Product" }, { type: "text", text: "Price" }], [{ type: "text", text: "Apple" }, { type: "number", value: 1000 }], [{ type: "text", text: "Orange" }, { type: "number", value: 10000 }], [{ type: "text", text: "Banana" }, { type: "number", value: 100000 }], ]); // Columnas con definición de tipo const columns = [ { columnId: "product", width: 200 }, { columnId: "price", width: 150 } ]; // Filas con mapeo a celdas const rows = cells.map((row, rowIndex) => ({ rowId: rowIndex.toString(), cells: row })); // Función para manejar cambios en las celdas const onCellsChanged = (changes) => { const newCells = cells.map(row => [...row]); changes.forEach(({ cell, rowId, columnId }) => { const rowIndex = Number(rowId); const colIndex = columnId === "product" ? 0 : 1; newCells[rowIndex][colIndex] = cell; }); setCells(newCells); }; // Función para renderear la celda (usar el formateo americano para el precio) const customCellRender = (cell, columnId, rowId, onCellChanged) => { if (columnId === "price" && cell.type === "number") { return ( <AmericanNumberCell value={cell.value} columnId={columnId} rowId={rowId} onCellChanged={onCellChanged} /> ); } return undefined; // Usa renderizado por defecto para otras celdas }; return ( <ReactGrid rows={rows} columns={columns} onCellsChanged={onCellsChanged} customCellRender={customCellRender} /> ); }; export default App;
Detalles de este ejemplo:
Se definió un componente AmericanNumberCell que usa Intl.NumberFormat para formatear con coma como separador de miles y dos decimales.
El estado
cells
contiene datos iniciales con productos y precios.La propiedad
customCellRender
de ReactGrid se usa para interceptar la renderización de la columna «price» y aplicar el formateo americano solo a esas celdas numéricas.Cambios en las celdas se manejan con onCellsChanged para actualizar el estado.
Con este enfoque, los números aparecerán como 1,000.00, 10,000.00, etc., en la grilla ReactGrid.
Para permitir edición de números con formato americano (1,000.00, etc.) en ReactGrid, se puede implementar un editor personalizado que use un input para mostrar y modificar el número en formato local, y convierta el texto ingresado a valor numérico para la celda.
Aquí un ejemplo completo con edición:
import React, { useState, useEffect, useRef } from "react"; import { ReactGrid, NumberCell, EditCellProps, CellBase, CellChange, Row, Column } from "@silevis/reactgrid"; // Componente para visualización formateada de número americano const AmericanNumberCell = ({ value, columnId, rowId, onCellChanged }) => { const formattedValue = new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(value); return ( <NumberCell value={formattedValue} columnId={columnId} rowId={rowId} onCellChanged={onCellChanged} /> ); }; // Editor personalizado para editar número con formato americano const AmericanNumberEditor = ({ initialValue, onBlur, onChange }) => { const [inputValue, setInputValue] = useState( new Intl.NumberFormat('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }).format(initialValue) ); const inputRef = useRef(null); useEffect(() => { inputRef.current.focus(); }, []); // Convertir cadena a número al modificar input (eliminar comas) const handleChange = (e) => { const val = e.target.value; setInputValue(val); // Convertir a número quitando comas const numericValue = Number(val.replace(/,/g, '')); if (!isNaN(numericValue)) { onChange(numericValue); } }; return ( <input ref={inputRef} type="text" value={inputValue} onChange={handleChange} onBlur={onBlur} style={{ width: "100%", boxSizing: "border-box" }} /> ); }; const App = () => { const [cells, setCells] = useState([ [{ type: "text", text: "Product" }, { type: "text", text: "Price" }], [{ type: "text", text: "Apple" }, { type: "number", value: 1000 }], [{ type: "text", text: "Orange" }, { type: "number", value: 10000 }], [{ type: "text", text: "Banana" }, { type: "number", value: 100000 }], ]); const columns = [ { columnId: "product", width: 200 }, { columnId: "price", width: 150 } ]; const rows = cells.map((row, rowIndex) => ({ rowId: rowIndex.toString(), cells: row })); const onCellsChanged = (changes) => { const newCells = cells.map(row => [...row]); changes.forEach(({ cell, rowId, columnId }) => { const rowIndex = Number(rowId); const colIndex = columnId === "product" ? 0 : 1; newCells[rowIndex][colIndex] = cell; }); setCells(newCells); }; // Renderizado personalizado para celdas "price" const customCellRender = (cell, columnId, rowId, onCellChanged) => { if (columnId === "price" && cell.type === "number") { return ( <AmericanNumberCell value={cell.value} columnId={columnId} rowId={rowId} onCellChanged={onCellChanged} /> ); } return undefined; }; // Editor personalizado para celdas "price" const customCellEditor = (cell, columnId, rowId, onCellChanged) => { if (columnId === "price" && cell.type === "number") { return ( <AmericanNumberEditor initialValue={cell.value} onChange={(newValue) => onCellChanged({ ...cell, value: newValue }, rowId, columnId)} onBlur={() => {}} /> ); } return undefined; }; return ( <ReactGrid rows={rows} columns={columns} onCellsChanged={onCellsChanged} customCellRender={customCellRender} customCellEditor={customCellEditor} /> ); }; export default App;
Explicación:
El componente
AmericanNumberEditor
muestra el número formateado y lo permite editar como texto.En la edición, elimina comas para convertir el texto a número correcto.
La función
customCellEditor
en ReactGrid usa este editor personalizado solo para la columna «price».Así, la visualización y edición usan el mismo formato americano amigable.
Esto garantiza números visualizados y editados con formato 1,000.00, 10,000.00, etc., manteniendo la usabilidad.
Comentarios recientes