Skip to content

Formatting ​

Number and value formatting utilities.

Overview ​

The formatters module provides functions to format numbers, currencies, percentages, and other values for display.

Basic Functions ​

millify() ​

Convert large numbers to abbreviated format with K, M, B, T suffixes.

typescript
import { millify } from 'tradingview-screener';

millify(1000);        // "1K"
millify(1500);        // "1.5K"
millify(1_000_000);   // "1M"
millify(1_234_567);   // "1.23M"
millify(1_000_000_000); // "1B"
millify(1_234_567_890_123); // "1.23T"

Parameters ​

typescript
millify(value: number, precision?: number): string
  • value - Number to format
  • precision - Decimal places (default: 2)

Examples ​

typescript
// Default precision (2 decimals)
millify(1234567);        // "1.23M"

// Custom precision
millify(1234567, 0);     // "1M"
millify(1234567, 1);     // "1.2M"
millify(1234567, 3);     // "1.235M"

// Small numbers
millify(999);            // "999"
millify(1000);           // "1K"

// Negative numbers
millify(-1500000);       // "-1.5M"

// Zero
millify(0);              // "0"

formatCurrency() ​

Format numbers as currency with appropriate precision.

typescript
import { formatCurrency } from 'tradingview-screener';

formatCurrency(1234.56);      // "$1,234.56"
formatCurrency(1000000);      // "$1,000,000.00"
formatCurrency(0.99);         // "$0.99"
formatCurrency(-500.25);      // "-$500.25"

Parameters ​

typescript
formatCurrency(value: number, symbol?: string, decimals?: number): string
  • value - Number to format
  • symbol - Currency symbol (default: "$")
  • decimals - Decimal places (default: 2)

Examples ​

typescript
// Default (USD)
formatCurrency(1234.56);              // "$1,234.56"

// Custom currency
formatCurrency(1234.56, '€');         // "€1,234.56"
formatCurrency(1234.56, '£');         // "£1,234.56"
formatCurrency(1234.56, '¥');         // "¥1,234.56"

// Custom decimals
formatCurrency(1234.5, '$', 0);       // "$1,235"
formatCurrency(1234.567, '$', 3);     // "$1,234.567"

// Large numbers
formatCurrency(1_000_000);            // "$1,000,000.00"
formatCurrency(1_234_567.89);         // "$1,234,567.89"

formatPercent() ​

Format numbers as percentages.

typescript
import { formatPercent } from 'tradingview-screener';

formatPercent(0.1234);        // "12.34%"
formatPercent(0.05);          // "5.00%"
formatPercent(1.5);           // "150.00%"
formatPercent(-0.025);        // "-2.50%"

Parameters ​

typescript
formatPercent(value: number, decimals?: number, multiply?: boolean): string
  • value - Number to format
  • decimals - Decimal places (default: 2)
  • multiply - Whether to multiply by 100 (default: true)

Examples ​

typescript
// Default (multiply by 100)
formatPercent(0.1234);                  // "12.34%"
formatPercent(0.05);                    // "5.00%"

// Already in percent format
formatPercent(12.34, 2, false);         // "12.34%"
formatPercent(5, 2, false);             // "5.00%"

// Custom decimals
formatPercent(0.12345, 0);              // "12%"
formatPercent(0.12345, 1);              // "12.3%"
formatPercent(0.12345, 3);              // "12.345%"

// Large percentages
formatPercent(2.5);                     // "250.00%"

// Negative percentages
formatPercent(-0.1234);                 // "-12.34%"

formatFloat() ​

Format floating-point numbers with fixed precision.

typescript
import { formatFloat } from 'tradingview-screener';

formatFloat(123.456789);              // "123.46"
formatFloat(123.456789, 0);           // "123"
formatFloat(123.456789, 4);           // "123.4568"
formatFloat(0.000123);                // "0.00"

Parameters ​

typescript
formatFloat(value: number, decimals?: number): string
  • value - Number to format
  • decimals - Decimal places (default: 2)

Examples ​

typescript
// Default precision (2 decimals)
formatFloat(123.456);                 // "123.46"
formatFloat(123.4);                   // "123.40"

// Custom precision
formatFloat(123.456789, 0);           // "123"
formatFloat(123.456789, 1);           // "123.5"
formatFloat(123.456789, 4);           // "123.4568"

// Very small numbers
formatFloat(0.001);                   // "0.00"
formatFloat(0.001, 3);                // "0.001"
formatFloat(0.001, 4);                // "0.0010"

// Scientific notation handling
formatFloat(1.23e-5, 6);              // "0.000012"

formatNumber() ​

Format numbers with thousands separators.

typescript
import { formatNumber } from 'tradingview-screener';

formatNumber(1234567);                // "1,234,567"
formatNumber(1000);                   // "1,000"
formatNumber(123.45);                 // "123.45"
formatNumber(-9876543);               // "-9,876,543"

Parameters ​

typescript
formatNumber(value: number, decimals?: number): string
  • value - Number to format
  • decimals - Decimal places (default: auto)

Examples ​

typescript
// Integers
formatNumber(1234567);                // "1,234,567"
formatNumber(1000);                   // "1,000"

// Decimals
formatNumber(1234.56);                // "1,234.56"
formatNumber(1234.56, 1);             // "1,234.6"
formatNumber(1234.5678, 2);           // "1,234.57"

// Small numbers
formatNumber(123);                    // "123"
formatNumber(12.34);                  // "12.34"

// Negative numbers
formatNumber(-1234567);               // "-1,234,567"

Field-Specific Formatting ​

formatByFieldType() ​

Format values based on field metadata format type.

typescript
import { formatByFieldType } from 'tradingview-screener';
import { StockField } from 'tradingview-screener';

// Currency fields
const price = StockField.PRICE;
formatByFieldType(123.45, price.format);  // "$123.45"

// Percent fields
const change = StockField.CHANGE_PERCENT;
formatByFieldType(5.67, change.format);   // "5.67%"

// Number fields
const volume = StockField.VOLUME;
formatByFieldType(1234567, volume.format); // "1,234,567"

Format Types ​

The library supports these format types:

typescript
type FieldFormat =
  | 'currency'           // $1,234.56
  | 'percent'            // 12.34%
  | 'float'              // 123.46
  | 'round'              // 123
  | 'number_group'       // 1,234,567
  | 'text'               // Raw text
  | 'date'               // Date string
  | 'bool'               // true/false
  | 'rating'             // Strong Buy, Buy, Hold, Sell, Strong Sell
  | 'recommendation'     // Similar to rating
  | 'computed_recommendation'; // Technical recommendation

Practical Examples ​

Format Screener Results ​

typescript
const results = await screener.get();

results.data.forEach(row => {
  console.log({
    name: row.name,
    price: formatCurrency(row.close),
    volume: millify(row.volume),
    marketCap: millify(row.market_cap_basic),
    change: formatPercent(row.change_abs / 100),
  });
});

Create Formatted Table ​

typescript
const results = await screener
  .select(
    StockField.NAME,
    StockField.PRICE,
    StockField.VOLUME,
    StockField.MARKET_CAPITALIZATION,
    StockField.CHANGE_PERCENT
  )
  .get();

const formatted = results.data.map(row => ({
  Name: row.name,
  Price: formatCurrency(row.close),
  Volume: millify(row.volume),
  'Market Cap': millify(row.market_cap_basic),
  'Change %': formatPercent(row.change_abs / 100),
}));

console.table(formatted);

Format for Export ​

typescript
function formatForCSV(results: ScreenerResult): string {
  const headers = ['Name', 'Price', 'Volume', 'Market Cap', 'Change %'];

  const rows = results.data.map(row => [
    row.name,
    formatCurrency(row.close),
    millify(row.volume),
    millify(row.market_cap_basic),
    formatPercent(row.change_abs / 100),
  ]);

  return [
    headers.join(','),
    ...rows.map(row => row.join(',')),
  ].join('\n');
}

// Usage
const csv = formatForCSV(results);
fs.writeFileSync('stocks.csv', csv);

Custom Formatting Function ​

typescript
function formatStockData(data: any) {
  return {
    name: data.name,
    price: formatCurrency(data.close),
    priceChange: formatPercent(data.change_abs / 100),
    volume: millify(data.volume),
    avgVolume: millify(data.average_volume_10d_calc),
    marketCap: millify(data.market_cap_basic),
    peRatio: formatFloat(data.price_earnings_ttm),
    dividendYield: formatPercent(data.dividend_yield_recent),
  };
}

// Usage
const formatted = results.data.map(formatStockData);

Number Abbreviations ​

Abbreviation Thresholds ​

typescript
millify(999);             // "999"     (< 1K)
millify(1_000);           // "1K"      (>= 1K)
millify(999_999);         // "1000K"   (< 1M)
millify(1_000_000);       // "1M"      (>= 1M)
millify(999_999_999);     // "1000M"   (< 1B)
millify(1_000_000_000);   // "1B"      (>= 1B)
millify(1_000_000_000_000); // "1T"    (>= 1T)

Custom Abbreviation ​

typescript
function customAbbreviate(value: number): string {
  const abs = Math.abs(value);
  const sign = value < 0 ? '-' : '';

  if (abs >= 1e12) return sign + (abs / 1e12).toFixed(2) + 'T';
  if (abs >= 1e9)  return sign + (abs / 1e9).toFixed(2) + 'B';
  if (abs >= 1e6)  return sign + (abs / 1e6).toFixed(2) + 'M';
  if (abs >= 1e3)  return sign + (abs / 1e3).toFixed(2) + 'K';

  return value.toString();
}

Locale Support ​

Default Locale (US) ​

typescript
// US format
formatCurrency(1234.56);      // "$1,234.56"
formatNumber(1234567);         // "1,234,567"
formatPercent(0.1234);         // "12.34%"

Custom Locale ​

typescript
function formatCurrencyEU(value: number): string {
  return new Intl.NumberFormat('de-DE', {
    style: 'currency',
    currency: 'EUR',
  }).format(value);
}

formatCurrencyEU(1234.56);     // "1.234,56 €"

Date Formatting ​

Format Timestamps ​

typescript
function formatDate(timestamp: number): string {
  return new Date(timestamp * 1000).toLocaleDateString();
}

function formatDateTime(timestamp: number): string {
  return new Date(timestamp * 1000).toLocaleString();
}

// Usage
formatDate(1609459200);         // "1/1/2021"
formatDateTime(1609459200);     // "1/1/2021, 12:00:00 AM"

Format Time Ago ​

typescript
function timeAgo(timestamp: number): string {
  const seconds = Math.floor(Date.now() / 1000 - timestamp);

  if (seconds < 60) return `${seconds}s ago`;
  if (seconds < 3600) return `${Math.floor(seconds / 60)}m ago`;
  if (seconds < 86400) return `${Math.floor(seconds / 3600)}h ago`;

  return `${Math.floor(seconds / 86400)}d ago`;
}

// Usage
timeAgo(Date.now() / 1000 - 30);    // "30s ago"
timeAgo(Date.now() / 1000 - 300);   // "5m ago"

Boolean Formatting ​

Format Boolean Values ​

typescript
function formatBoolean(value: boolean): string {
  return value ? '✓' : '✗';
}

function formatBooleanText(value: boolean): string {
  return value ? 'Yes' : 'No';
}

// Usage
formatBoolean(true);           // "✓"
formatBoolean(false);          // "✗"
formatBooleanText(true);       // "Yes"

Best Practices ​

1. Use Appropriate Precision ​

typescript
// Good: Appropriate precision
formatCurrency(123.45);        // "$123.45"
formatPercent(0.1234, 2);      // "12.34%"

// Avoid: Too much precision
formatFloat(123.456789, 10);   // "123.4567890000"

2. Handle Edge Cases ​

typescript
function safeFormat(value: number | null | undefined): string {
  if (value === null || value === undefined) return 'N/A';
  if (isNaN(value)) return 'Invalid';
  if (!isFinite(value)) return value > 0 ? '∞' : '-∞';

  return formatFloat(value);
}

3. Consistent Formatting ​

typescript
// Good: Consistent throughout
const formatted = {
  price: formatCurrency(price),
  volume: millify(volume),
  change: formatPercent(change / 100),
};

// Inconsistent: Mixed formats
const mixed = {
  price: `$${price.toFixed(2)}`,
  volume: volume.toString(),
  change: change + '%',
};

4. Performance Considerations ​

typescript
// Cache formatters for repeated use
const currencyFormatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD',
});

// Reuse formatter
results.data.forEach(row => {
  console.log(currencyFormatter.format(row.close));
});

Next Steps ​

Released under the MIT License.