diff --git a/.changeset/fresh-otters-count.md b/.changeset/fresh-otters-count.md new file mode 100644 index 0000000..f9f9420 --- /dev/null +++ b/.changeset/fresh-otters-count.md @@ -0,0 +1,5 @@ +--- +'@obosbbl/format': minor +--- + +Add Norwegian account number formatting. diff --git a/packages/format/README.md b/packages/format/README.md index 9b35131..2e49275 100644 --- a/packages/format/README.md +++ b/packages/format/README.md @@ -43,5 +43,6 @@ formatOrganizationNumber('0000000000') // => '000000-0000' * formatPhoneNumber * formatOrganizationNumber +* formatAccountNumber * formatObosMembershipNumber * formatPostalCode diff --git a/packages/format/src/format.test.ts b/packages/format/src/format.test.ts index db3a649..db4b2bd 100644 --- a/packages/format/src/format.test.ts +++ b/packages/format/src/format.test.ts @@ -1,5 +1,6 @@ import { describe, expect, test } from 'vitest'; import { + formatAccountNumber as formatAccountNumberNo, formatObosMembershipNumber as formatObosMembershipNumberNo, formatOrganizationNumber as formatOrganizationNumberNo, formatPhoneNumber as formatPhoneNumberNo, @@ -31,6 +32,15 @@ describe('no', () => { expect(formatOrganizationNumberNo(input)).toBe(expected); }); + test.each([ + ['00000000000', '0000 00 00000'], + ['0000 00 00000', '0000 00 00000'], + ['0000.00.00000', '0000 00 00000'], + ['abc', 'abc'], + ])('formatAccountNumber(%s) -> %s', (input, expected) => { + expect(formatAccountNumberNo(input)).toBe(expected); + }); + test.each([['0000', '0000']])( 'formatPostalCode(%s) -> %s', (input, expected) => { diff --git a/packages/format/src/index.ts b/packages/format/src/index.ts index e89391b..4e09b2c 100644 --- a/packages/format/src/index.ts +++ b/packages/format/src/index.ts @@ -1,4 +1,5 @@ import { + formatAccountNumber as _formatAccountNumber, formatObosMembershipNumber as _formatObosMembershipNumber, formatOrganizationNumber as formatOrganizationNumberNo, formatPhoneNumber as formatPhoneNumberNo, @@ -16,6 +17,10 @@ type Options = { locale: Locale; }; +type NorwegianOptions = { + locale: 'no'; +}; + /** * Format a phone number. * @@ -51,6 +56,21 @@ export function formatOrganizationNumber( : formatOrganizationNumberSe(input); } +/** + * Format a Norwegian account number + * @example + * ``` + * formatAccountNumber('00000000000', { locale: 'no' }) // => '0000 00 00000' + * ``` + */ +export function formatAccountNumber( + input: string, + options: NorwegianOptions, +): string { + // This is currently a Norwegian-only formatter. Keep the options argument for API consistency. + return _formatAccountNumber(input); +} + /** * Format a postal code * @example diff --git a/packages/format/src/no.ts b/packages/format/src/no.ts index 9e59471..c087dfc 100644 --- a/packages/format/src/no.ts +++ b/packages/format/src/no.ts @@ -52,6 +52,19 @@ export function formatOrganizationNumber(input: string): string { return replaceIfMatch(input, ORG_NUMBER_FORMAT, '$1 $2 $3'); } +const ACCOUNT_NUMBER_FORMAT = /^(\d{4})(\d{2})(\d{5})$/; + +/** + * Format a Norwegian account number + * @example + * ``` + * formatAccountNumber('00000000000') // => '0000 00 00000' + * ``` + */ +export function formatAccountNumber(input: string): string { + return replaceIfMatch(input, ACCOUNT_NUMBER_FORMAT, '$1 $2 $3'); +} + const OBOS_MEMBERSHIP_NUMBER_FORMAT = /^(\d{3})(\d{2})(\d{2})$/; /**