Number Formatting
Basic Usage
You can localize the number with your definition formats.
Number formats the below:
const numberFormats = {
'en-US': {
currency: {
style: 'currency', currency: 'USD', notation: 'standard'
},
decimal: {
style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2
},
percent: {
style: 'percent', useGrouping: false
}
},
'ja-JP': {
currency: {
style: 'currency', currency: 'JPY', useGrouping: true, currencyDisplay: 'symbol'
},
decimal: {
style: 'decimal', minimumSignificantDigits: 3, maximumSignificantDigits: 5
},
percent: {
style: 'percent', useGrouping: false
}
}
}
As the above, you can define named number formats (e.g. currency
, etc), and you need to use the options with ECMA-402 Intl.NumberFormat
After that, when using the locale messages, you need to specify the numberFormats
option of createI18n
:
const i18n = createI18n({
numberFormats
})
To localize Number value with Vue I18n, use the $n
.
NOTE
$n
has some overloads. About these overloads, see the API Reference
The following is an example of the use of $n
in a template:
<p>{{ $n(10000, 'currency') }}</p>
<p>{{ $n(10000, 'currency', 'ja-JP') }}</p>
<p>{{ $n(10000, 'currency', 'ja-JP', { useGrouping: false }) }}</p>
<p>{{ $n(987654321, 'currency', { notation: 'compact' }) }}</p>
<p>{{ $n(0.99123, 'percent') }}</p>
<p>{{ $n(0.99123, 'percent', { minimumFractionDigits: 2 }) }}</p>
<p>{{ $n(12.11612345, 'decimal') }}</p>
<p>{{ $n(12145281111, 'decimal', 'ja-JP') }}</p>
The first argument is numeric value as a parameter, and the second argument is number format name as a parameter. The last argument locale value as a parameter.
As result the below:
<p>$10,000.00</p>
<p>¥10,000</p>
<p>¥10000</p>
<p>$988M</p>
<p>99%</p>
<p>99.12%</p>
<p>12.12</p>
<p>12,145,000,000</p>
Custom Formatting
$n
returns resulting string with fully formatted number, which can only be used as a whole. In situations when you need to style some part of the formatted number (like fraction digits), $n
is not enough. In such cases NumberFormat component (i18n-n
) will be of help.
With a minimum set of properties, i18n-n
generates the same output as $n
, wrapped into configured DOM element.
The following template:
<i18n-n tag="span" :value="100"></i18n-n>
<i18n-n tag="span" :value="100" format="currency"></i18n-n>
<i18n-n tag="span" :value="100" format="currency" locale="ja-JP"></i18n-n>
NumberFormat component has some props.
The tag
is the property to set the tag.
The value
is the property to set the numeric value to be formatted.
The format
is the property to which the format defined by the numberFormats
option of createI18n
can be set.
The locale
is the property to set the locale. It's localized with the locale specified by this prop instead of the one specified with the locale
option of createI18n
.
Will produce the below output:
<span>100</span>
<span>$100.00</span>
<span>¥100</span>
But the real power of this component comes into play when it is used with scoped slots.
Let’s say there is a requirement to render the integer part of the number with a bolder font. This can be achieved by specifying integer
scoped slot element:
<i18n-n tag="span" :value="100" format="currency">
<template #integer="slotProps">
<span style="font-weight: bold">{{ slotProps.integer }}</span>
</template>
</i18n-n>
Template above will result in the following HTML:
<span>$<span style="font-weight: bold">100</span>.00</span>
It is possible to specify multiple scoped slots at the same time:
<i18n-n tag="span" :value="1234" :format="{ key: 'currency', currency: 'EUR' }">
<template #currency="slotProps">
<span style="color: green">{{ slotProps.currency }}</span>
</template>
<template #integer="slotProps">
<span style="font-weight: bold">{{ slotProps.integer }}</span>
</template>
<template #group="slotProps">
<span style="font-weight: bold">{{ slotProps.group }}</span>
</template>
<template #fraction="slotProps">
<span style="font-size: small">{{ slotProps.fraction }}</span>
</template>
</i18n-n>
(this resulting HTML was formatted for better readability)
<span>
<span style="color: green">€</span>
<span style="font-weight: bold">1</span>
<span style="font-weight: bold">,</span>
<span style="font-weight: bold">234</span>
.
<span style="font-size: small">00</span>
</span>
NOTE
Full list of the supported scoped slots as well as other i18n-n
, properties can be found on API Reference.
Scope resolving
The Scope resolving of NumberFormat component is same as Translation component.
See the here