Switzerland Number Format
Try It — Live Preview
Format Rules
Switzerland formatting implementation notes
For Switzerland, format numbers with the explicit locale de-CH; the reference value 1234567.89 renders as 1'234'567.89.
Switzerland's reference format uses "." as the decimal mark and apostrophe ("'") for grouping. The integer uses repeating groups of three digits. Pass "de-CH" directly to Intl.NumberFormat instead of replacing punctuation in a preformatted string.
CHF is shown with CHF before the amount with a separating space; the same reference value renders as CHF 1'234'567.89. The percent sign appears immediately after the amount. Use the ISO currency code for storage and interchange because a visible symbol can be shared by unrelated currencies.
Western 0–9 digits are the page's reference digit system, and the negative pattern is -n. This country is multilingual in software contexts: also test fr-CH, it-CH, because language selection can change spacing, punctuation, and currency display without changing the region. Validate output with formatToParts() when spacing, signs, or bidirectional literals affect the interface.
- Locale: de-CH
- Decimal and grouping: 1'234'567.89
- Currency: CHF → CHF 1'234'567.89
- Digits: Western 0–9 digits
Reviewed 19 July 2026. Sources: Unicode locale number formats · Intl.NumberFormat reference
What's different here
- Thousands are grouped with an ASCII apostrophe (') (en-US uses a comma (,)).
- The currency symbol goes before the amount with a space (en-US: immediately before the amount).
- No other page in this directory shares this exact number pattern.
- Nearby differences: United Kingdom (en-GB) groups with a comma (,) instead of an ASCII apostrophe (') and places the currency symbol immediately before the amount; Netherlands (nl-NL) uses a comma (,) as the decimal mark instead of a period (.) and groups with a period (.) instead of an ASCII apostrophe ('); Ireland (en-IE) groups with a comma (,) instead of an ASCII apostrophe (') and places the currency symbol immediately before the amount; Malta (mt-MT) groups with a comma (,) instead of an ASCII apostrophe (') and places the currency symbol immediately before the amount.
- Currency: CHF has ISO minor unit 2.
- Postal address order: name → building → street + street number → postcode + city → country. See address formats.
Reference value 1234567.89 in each locale
| Locale | Output |
|---|---|
| de-CH | 1'234'567.89 |
| fr-CH | 1'234'567,89 |
| it-CH | 1'234'567.89 |
Rendered with the platform's CLDR data at build time.
Swiss number format
Swiss German (de-CH) and Swiss Italian (it-CH) write 1234567.89 as 1'234'567.89: an apostrophe between thousands and a period for decimals, the opposite of Germany. Swiss French (fr-CH) uses the same apostrophe but a comma for decimals: 1'234'567,89. Current CLDR data (version 48 and later) uses the plain apostrophe U+0027. Older runtimes print the curly U+2019, so never hard-code either one.
Read the apostrophe from the locale
const groupChar = (locale) =>
new Intl.NumberFormat(locale).formatToParts(1234567).find(p => p.type === 'group').value;
groupChar('de-CH') === "'"; // → true
groupChar('fr-CH') === "'"; // → true
groupChar('it-CH') === "'"; // → trueOn a CLDR 46/47 runtime (for example Node 20), the first and third lines return false (U+2019), and fr-CH returns U+202F. For typed input, accept every form:
const parseSwiss = (input, decimal) =>
Number(input.replace(/['\u2019\u202F\u00A0 ]/g, '').replace(decimal, '.'));
parseSwiss("1'234'567.89", '.'); // → 1234567.89
parseSwiss("1’234’567.89", '.'); // → 1234567.89
parseSwiss("1'234'567,89", ','); // → 1234567.89Pass '.' for de-CH and it-CH. For fr-CH, pass ',' for plain numbers and '.' for CHF amounts (see below).
CHF amounts in de-CH, fr-CH and it-CH
new Intl.NumberFormat('de-CH', { style: 'currency', currency: 'CHF' }).format(1234567.89);
// → "CHF 1'234'567.89"
new Intl.NumberFormat('fr-CH', { style: 'currency', currency: 'CHF' }).format(1234567.89);
// → "1'234'567.89 CHF"
new Intl.NumberFormat('it-CH', { style: 'currency', currency: 'CHF' }).format(1234567.89);
// → "CHF 1'234'567.89"
new Intl.NumberFormat('de-CH', { style: 'currency', currency: 'CHF', currencySign: 'accounting' }).format(-999.5);
// → "CHF-999.50"
new Intl.NumberFormat('fr-CH', { style: 'currency', currency: 'CHF', currencySign: 'accounting' }).format(-999.5);
// → "(999.50 CHF)"| de-CH | fr-CH | it-CH | |
|---|---|---|---|
| CHF amount | CHF 1'234'567.89 | 1'234'567.89 CHF | CHF 1'234'567.89 |
| Decimal mark in CHF amounts | . | . (plain numbers: ,) | . |
| Negative, accounting | CHF-999.50 | (999.50 CHF) | CHF-999.50 |
| Percent (0.13) | 13% | 13% | 13% |
| Compact (1234567) | 1.2 Mio. | 1,2 M | 1.2 Mln |
Two things catch people out:
- fr-CH switches decimal marks. Plain numbers use a comma, CHF amounts use a period. That's CLDR data (
currencyDecimalinfr_CH.xml), not a typo. Format money withstyle: 'currency'; don't format a number and glue "CHF" on. - Accounting negatives differ: parentheses in fr-CH, a minus after the code in de-CH and it-CH.
CHF in data
CHF is the ISO 4217 code for the Swiss franc (numeric 756, minor unit 2), used in Switzerland and Liechtenstein. Intl displays it as CHF in all three Swiss locales. Store CHF with every amount.
Coins. The smallest coin in circulation is 5 centimes. The 1-centime coin was withdrawn on 1 January 2007 (Swiss National Bank).
Q&A
What is the Swiss thousands separator?
An apostrophe in de-CH, fr-CH and it-CH. Current CLDR uses U+0027 ('); runtimes on older CLDR data print U+2019 (’), and U+202F for fr-CH. Read it from formatToParts().
Does Switzerland use a comma or a period for decimals?
A period in de-CH and it-CH. fr-CH uses a comma for plain numbers but a period in CHF amounts.
Is it CHF or Fr.?
For formatted output, CHF. That's what Intl prints in every Swiss locale, and it's the ISO code you should store.
Which locales should a Swiss product support?
At least de-CH, fr-CH and it-CH, the three this page covers.
Code Examples
// Basic number
new Intl.NumberFormat('de-CH').format(1234567.89)
// → "1'234'567.89"
// Currency
new Intl.NumberFormat('de-CH', {
style: 'currency',
currency: 'CHF'
}).format(1234567.89)
// → "CHF 1'234'567.89"
// Percentage
new Intl.NumberFormat('de-CH', {
style: 'percent',
minimumFractionDigits: 1
}).format(0.125)
// Compact notation
new Intl.NumberFormat('de-CH', {
notation: 'compact'
}).format(1234567)Negative Number Formats
new Intl.NumberFormat('de-CH').format(-1234567.89)new Intl.NumberFormat('de-CH', { style: 'currency', currency: 'CHF', currencySign: 'accounting' }).format(-1234567.89)Edge Cases & Notes
Apostrophe as thousands separator (U+0027 in CLDR 48 and later; older runtimes print U+2019, so read it from formatToParts()). Decimal uses period — opposite of neighboring Germany.
Continue your localization implementation
Connect this reference to the format, validation, and testing guidance used elsewhere on the site.
Formatting implementation
Numbers, currencies, dates, time zones, numbering systems, and production tests.
Failure patterns
Hardcoded copy, broken layouts, missing context, bidi, and cultural adaptation.
Standards reference
ISO country, currency, and language codes; BCP 47; E.164; and UPU S42.
Validation coverage
Provider evidence, country test cases, geocoding, deliverability, and phone checks.
Locale-aware numbers
Separators, grouping, currency precision, and Intl.NumberFormat patterns.
Localization testing
Pseudolocalization, test matrices, native review, and regional release gates.
Address and phone standards
UPU S42, E.164, adaptive forms, storage, parsing, and validation.
I18n architecture
Messages, Unicode, RTL, locale services, fallbacks, and delivery workflow.
Currency reference
ISO 4217 codes, symbols, minor units, and implementation examples.
Address formats
Country templates, field order, and accessible international forms.
Phone formats
E.164 storage, regional display, parsing, and validation.
Compare locales
Inspect the same numeric value across several country formats.
Interactive tools
Try number, address, and phone formatting in your browser.
