@pbkware/dot-net-date-number-formatting - v0.3.2
    Preparing search index...

    Advanced Examples

    Building an application that supports multiple locales:

    import { 
    DotNetFloatFormatter,
    DotNetDateTimeFormatter,
    DotNetLocaleSettings
    } from '@pbkware/dot-net-date-number-formatting';

    class LocalizedFormatter {
    private numberFormatter: DotNetFloatFormatter;
    private dateFormatter: DotNetDateTimeFormatter;

    constructor(locale: string) {
    const settings = DotNetLocaleSettings.create(locale);

    this.numberFormatter = new DotNetFloatFormatter();
    this.numberFormatter.localeSettings = settings;

    this.dateFormatter = new DotNetDateTimeFormatter();
    this.dateFormatter.localeSettings = settings;
    }

    formatCurrency(value: number): string {
    this.numberFormatter.trySetFormat('C2');
    return this.numberFormatter.toString(value);
    }

    formatDate(date: Date): string {
    this.dateFormatter.trySetFormat('d');
    return this.dateFormatter.toString(date);
    }

    formatDateTime(date: Date): string {
    this.dateFormatter.trySetFormat('F');
    return this.dateFormatter.toString(date);
    }
    }

    // Usage
    const usFormatter = new LocalizedFormatter('en-US');
    console.log(usFormatter.formatCurrency(1234.56)); // "$1,234.56"
    console.log(usFormatter.formatDate(new Date(2024, 6, 5))); // "7/5/2024"

    const frFormatter = new LocalizedFormatter('fr-FR');
    console.log(frFormatter.formatCurrency(1234.56)); // "1 234,56 €"
    console.log(frFormatter.formatDate(new Date(2024, 6, 5))); // "05/07/2024"

    Formatting data for export and parsing on import:

    import { 
    DotNetFloatFormatter,
    DotNetDateTimeFormatter,
    DotNetNumberStyles,
    DotNetLocaleSettings
    } from '@pbkware/dot-net-date-number-formatting';

    class DataExporter {
    private numberFormatter: DotNetFloatFormatter;
    private dateFormatter: DotNetDateTimeFormatter;

    constructor() {
    // Use invariant culture for consistent export format
    const settings = DotNetLocaleSettings.createInvariant();

    this.numberFormatter = new DotNetFloatFormatter();
    this.numberFormatter.localeSettings = settings;

    this.dateFormatter = new DotNetDateTimeFormatter();
    this.dateFormatter.localeSettings = settings;
    }

    exportRecord(data: { name: string; amount: number; date: Date }): string {
    this.numberFormatter.trySetFormat('F2');
    this.dateFormatter.trySetFormat('yyyy-MM-dd HH:mm:ss');

    const amountStr = this.numberFormatter.toString(data.amount);
    const dateStr = this.dateFormatter.toString(data.date);

    return `${data.name},${amountStr},${dateStr}`;
    }

    importRecord(line: string): { name: string; amount: number; date: Date } | null {
    const parts = line.split(',');
    if (parts.length !== 3) return null;

    this.numberFormatter.styles = DotNetNumberStyles.float;
    const amountResult = this.numberFormatter.tryFromString(parts[1]);
    if (amountResult.isErr()) return null;

    const dateResult = this.dateFormatter.tryFromString(parts[2]);
    if (dateResult.isErr()) return null;

    return {
    name: parts[0],
    amount: amountResult.value,
    date: dateResult.value
    };
    }
    }

    // Usage
    const exporter = new DataExporter();

    // Export
    const record = {
    name: 'Item1',
    amount: 1234.56,
    date: new Date(2024, 6, 5, 14, 30, 0)
    };
    const csv = exporter.exportRecord(record);
    console.log(csv); // "Item1,1234.56,2024-07-05 14:30:00"

    // Import
    const imported = exporter.importRecord(csv);
    console.log(imported);
    // { name: 'Item1', amount: 1234.56, date: Date(...) }

    Generating formatted reports:

    import { 
    DotNetFloatFormatter,
    DotNetDateTimeFormatter,
    DotNetLocaleSettings
    } from '@pbkware/dot-net-date-number-formatting';

    interface SalesRecord {
    product: string;
    quantity: number;
    unitPrice: number;
    date: Date;
    }

    class SalesReport {
    private currencyFormatter: DotNetFloatFormatter;
    private numberFormatter: DotNetFloatFormatter;
    private dateFormatter: DotNetDateTimeFormatter;

    constructor(locale: string = 'en-US') {
    const settings = DotNetLocaleSettings.create(locale);

    this.currencyFormatter = new DotNetFloatFormatter();
    this.currencyFormatter.localeSettings = settings;
    this.currencyFormatter.trySetFormat('C2');

    this.numberFormatter = new DotNetFloatFormatter();
    this.numberFormatter.localeSettings = settings;
    this.numberFormatter.trySetFormat('N0');

    this.dateFormatter = new DotNetDateTimeFormatter();
    this.dateFormatter.localeSettings = settings;
    this.dateFormatter.trySetFormat('d');
    }

    formatRecord(record: SalesRecord): string {
    const date = this.dateFormatter.toString(record.date);
    const quantity = this.numberFormatter.toString(record.quantity);
    const price = this.currencyFormatter.toString(record.unitPrice);
    const total = this.currencyFormatter.toString(record.quantity * record.unitPrice);

    return `${date.padEnd(12)} ${record.product.padEnd(20)} ${quantity.padStart(8)} ${price.padStart(12)} ${total.padStart(12)}`;
    }

    generate(records: SalesRecord[]): string {
    const header = 'Date Product Quantity Price Total';
    const separator = '='.repeat(70);

    const lines = records.map(r => this.formatRecord(r));

    // Calculate totals
    const totalQty = records.reduce((sum, r) => sum + r.quantity, 0);
    const totalAmount = records.reduce((sum, r) => sum + (r.quantity * r.unitPrice), 0);

    const totalQtyStr = this.numberFormatter.toString(totalQty);
    const totalAmtStr = this.currencyFormatter.toString(totalAmount);
    const totals = `${''.padEnd(33)}${totalQtyStr.padStart(8)} ${''.padStart(12)} ${totalAmtStr.padStart(12)}`;

    return [header, separator, ...lines, separator, totals].join('\n');
    }
    }

    // Usage
    const report = new SalesReport('en-US');

    const sales: SalesRecord[] = [
    { product: 'Widget A', quantity: 100, unitPrice: 12.50, date: new Date(2024, 6, 1) },
    { product: 'Widget B', quantity: 50, unitPrice: 25.00, date: new Date(2024, 6, 2) },
    { product: 'Widget C', quantity: 75, unitPrice: 18.75, date: new Date(2024, 6, 3) },
    ];

    console.log(report.generate(sales));
    // Date Product Quantity Price Total
    // ======================================================================
    // 7/1/2024 Widget A 100 $12.50 $1,250.00
    // 7/2/2024 Widget B 50 $25.00 $1,250.00
    // 7/3/2024 Widget C 75 $18.75 $1,406.25
    // ======================================================================
    // 225 $3,906.25

    Storing configuration values with consistent formatting:

    import { 
    DotNetFloatFormatter,
    DotNetIntegerFormatter,
    DotNetDateTimeFormatter,
    DotNetLocaleSettings
    } from '@pbkware/dot-net-date-number-formatting';

    class ConfigManager {
    private settings = DotNetLocaleSettings.createInvariant();

    saveConfig(config: Record<string, any>): Record<string, string> {
    const result: Record<string, string> = {};

    for (const [key, value] of Object.entries(config)) {
    result[key] = this.formatValue(value);
    }

    return result;
    }

    private formatValue(value: any): string {
    if (typeof value === 'number') {
    if (Number.isInteger(value)) {
    const formatter = new DotNetIntegerFormatter();
    formatter.localeSettings = this.settings;
    formatter.trySetFormat('D');
    return formatter.toString(BigInt(value));
    } else {
    const formatter = new DotNetFloatFormatter();
    formatter.localeSettings = this.settings;
    formatter.trySetFormat('F6');
    return formatter.toString(value);
    }
    } else if (value instanceof Date) {
    const formatter = new DotNetDateTimeFormatter();
    formatter.localeSettings = this.settings;
    formatter.trySetFormat('O');
    return formatter.toString(value);
    } else if (typeof value === 'boolean') {
    return this.settings.boolToStr(value);
    } else {
    return String(value);
    }
    }
    }

    // Usage
    const manager = new ConfigManager();

    const config = {
    port: 8080,
    timeout: 30.5,
    enabled: true,
    lastUpdate: new Date(2024, 6, 5, 14, 30, 0),
    name: 'My App'
    };

    const saved = manager.saveConfig(config);
    console.log(saved);
    // {
    // port: "8080",
    // timeout: "30.500000",
    // enabled: "true",
    // lastUpdate: "2024-07-05T14:30:00.000Z",
    // name: "My App"
    // }

    Advanced date formatting scenarios:

    import { DotNetDateTimeFormatter, DotNetLocaleSettings } from '@pbkware/dot-net-date-number-formatting';

    class DateDisplay {
    private formatter: DotNetDateTimeFormatter;

    constructor(locale: string = 'en-US') {
    this.formatter = new DotNetDateTimeFormatter();
    this.formatter.localeSettings = DotNetLocaleSettings.create(locale);
    }

    // ISO 8601 format for APIs
    toISO(date: Date): string {
    this.formatter.trySetFormat('O');
    return this.formatter.toString(date);
    }

    // User-friendly display
    toFriendly(date: Date): string {
    this.formatter.trySetFormat("dddd, MMMM d 'at' h:mm tt");
    return this.formatter.toString(date);
    }

    // Filename-safe format
    toFilename(date: Date): string {
    this.formatter.trySetFormat('yyyy-MM-dd_HHmmss');
    return this.formatter.toString(date);
    }

    // Log timestamp
    toLogTimestamp(date: Date): string {
    this.formatter.trySetFormat('[yyyy-MM-dd HH:mm:ss.fff]');
    return this.formatter.toString(date);
    }

    // Relative date (simplified)
    toRelative(date: Date): string {
    const now = new Date();
    const diffMs = now.getTime() - date.getTime();
    const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));

    if (diffDays === 0) {
    this.formatter.trySetFormat("'Today at' h:mm tt");
    return this.formatter.toString(date);
    } else if (diffDays === 1) {
    this.formatter.trySetFormat("'Yesterday at' h:mm tt");
    return this.formatter.toString(date);
    } else if (diffDays < 7) {
    this.formatter.trySetFormat("dddd 'at' h:mm tt");
    return this.formatter.toString(date);
    } else {
    this.formatter.trySetFormat('M/d/yyyy');
    return this.formatter.toString(date);
    }
    }
    }

    // Usage
    const display = new DateDisplay('en-US');
    const date = new Date(2024, 6, 5, 14, 30, 45, 123);

    console.log(display.toISO(date));
    // "2024-07-05T14:30:45.123Z"

    console.log(display.toFriendly(date));
    // "Friday, July 5 at 2:30 PM"

    console.log(display.toFilename(date));
    // "2024-07-05_143045"

    console.log(display.toLogTimestamp(date));
    // "[2024-07-05 14:30:45.123]"

    Working with financial data:

    import { 
    DotNetDecimalFormatter,
    DotNetFloatFormatter,
    DotNetLocaleSettings
    } from '@pbkware/dot-net-date-number-formatting';

    class FinancialCalculator {
    private decimalFormatter: DotNetDecimalFormatter;
    private currencyFormatter: DotNetFloatFormatter;
    private percentFormatter: DotNetFloatFormatter;

    constructor(locale: string = 'en-US') {
    const settings = DotNetLocaleSettings.create(locale);

    this.decimalFormatter = new DotNetDecimalFormatter();
    this.decimalFormatter.localeSettings = settings;
    this.decimalFormatter.trySetFormat('F6');

    this.currencyFormatter = new DotNetFloatFormatter();
    this.currencyFormatter.localeSettings = settings;
    this.currencyFormatter.trySetFormat('C2');

    this.percentFormatter = new DotNetFloatFormatter();
    this.percentFormatter.localeSettings = settings;
    this.percentFormatter.trySetFormat('P2');
    }

    calculateInterest(principal: number, rate: number, years: number): {
    interest: string;
    total: string;
    rate: string;
    } {
    const interest = principal * rate * years;
    const total = principal + interest;

    return {
    rate: this.percentFormatter.toString(rate),
    interest: this.currencyFormatter.toString(interest),
    total: this.currencyFormatter.toString(total)
    };
    }

    formatTransaction(amount: number, description: string): string {
    this.currencyFormatter.trySetFormat('$#,##0.00;($#,##0.00)');
    const formatted = this.currencyFormatter.toString(amount);
    return `${description.padEnd(30)} ${formatted.padStart(15)}`;
    }
    }

    // Usage
    const calc = new FinancialCalculator('en-US');

    const result = calc.calculateInterest(10000, 0.05, 5);
    console.log(`Rate: ${result.rate}`); // "Rate: 5.00%"
    console.log(`Interest: ${result.interest}`); // "Interest: $2,500.00"
    console.log(`Total: ${result.total}`); // "Total: $12,500.00"

    console.log(calc.formatTransaction(1234.56, 'Deposit'));
    // "Deposit $1,234.56"
    console.log(calc.formatTransaction(-567.89, 'Withdrawal'));
    // "Withdrawal ($567.89)"