fix NPE in number formatting (#16760)

This commit is contained in:
Vadim Ogievetsky 2024-07-19 15:20:44 -07:00 committed by GitHub
parent a34a06e192
commit 72eeeec024
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 15 additions and 6 deletions

View File

@ -33,6 +33,7 @@ import {
columnToWidth, columnToWidth,
formatNumber, formatNumber,
getNumericColumnBraces, getNumericColumnBraces,
isNumberLike,
} from '../../utils'; } from '../../utils';
import { BracedText } from '../braced-text/braced-text'; import { BracedText } from '../braced-text/braced-text';
import { CellFilterMenu } from '../cell-filter-menu/cell-filter-menu'; import { CellFilterMenu } from '../cell-filter-menu/cell-filter-menu';
@ -157,7 +158,7 @@ export const RecordTablePane = React.memo(function RecordTablePane(props: Record
{numericColumnBraces[i] ? ( {numericColumnBraces[i] ? (
<BracedText <BracedText
className="table-padding" className="table-padding"
text={formatNumber(value)} text={isNumberLike(value) ? formatNumber(value) : String(value)}
braces={numericColumnBraces[i]} braces={numericColumnBraces[i]}
padFractionalPart padFractionalPart
/> />

View File

@ -24,6 +24,7 @@ import {
formatInteger, formatInteger,
formatMegabytes, formatMegabytes,
formatMillions, formatMillions,
formatNumber,
formatPercent, formatPercent,
hashJoaat, hashJoaat,
moveElement, moveElement,
@ -96,6 +97,15 @@ describe('general', () => {
}); });
}); });
describe('formatNumber', () => {
it('works', () => {
expect(formatNumber(null as any)).toEqual('0');
expect(formatNumber(0)).toEqual('0');
expect(formatNumber(5)).toEqual('5');
expect(formatNumber(5.1)).toEqual('5.1');
});
});
describe('formatInteger', () => { describe('formatInteger', () => {
it('works', () => { it('works', () => {
expect(formatInteger(10000)).toEqual('10,000'); expect(formatInteger(10000)).toEqual('10,000');

View File

@ -240,7 +240,7 @@ export function formatInteger(n: NumberLike): string {
} }
export function formatNumber(n: NumberLike): string { export function formatNumber(n: NumberLike): string {
return n.toLocaleString('en-US', { maximumFractionDigits: 20 }); return (n || 0).toLocaleString('en-US', { maximumFractionDigits: 20 });
} }
export function formatRate(n: NumberLike) { export function formatRate(n: NumberLike) {

View File

@ -20,7 +20,7 @@ import type { QueryResult } from '@druid-toolkit/query';
import { C } from '@druid-toolkit/query'; import { C } from '@druid-toolkit/query';
import type { Filter } from 'react-table'; import type { Filter } from 'react-table';
import { filterMap, formatNumber, oneOf } from './general'; import { filterMap, formatNumber, isNumberLike, oneOf } from './general';
import { deepSet } from './object-change'; import { deepSet } from './object-change';
export interface Pagination { export interface Pagination {
@ -55,9 +55,7 @@ export function getNumericColumnBraces(
queryResult.header.forEach((column, i) => { queryResult.header.forEach((column, i) => {
if (!oneOf(column.nativeType, 'LONG', 'FLOAT', 'DOUBLE')) return; if (!oneOf(column.nativeType, 'LONG', 'FLOAT', 'DOUBLE')) return;
const formatter = columnHints?.get(column.name)?.formatter || formatNumber; const formatter = columnHints?.get(column.name)?.formatter || formatNumber;
const braces = filterMap(rows, row => const braces = filterMap(rows, row => (isNumberLike(row[i]) ? formatter(row[i]) : undefined));
oneOf(typeof row[i], 'number', 'bigint') ? formatter(row[i]) : undefined,
);
if (braces.length) { if (braces.length) {
numericColumnBraces[i] = braces; numericColumnBraces[i] = braces;
} }