Skip to content

usePrice

Composable pour le formatage reactif des prix et devises. Base sur Intl.NumberFormat pour un formatage correct selon la locale. Expose les differentes parties du prix pour un rendu flexible.

Utilisation basique

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const { formatted, integerPart, decimalPart, currencySymbol } = usePrice({
  amount: 1299.99,
  currency: 'EUR',
  locale: 'fr-FR',
})
</script>

<template>
  <p>{{ formatted }}</p>
  <!-- "1 299,99 €" -->
</template>

Exemples

Parties du prix

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const price = usePrice({ amount: 1299.99 })
</script>

<template>
  <span class="price">
    <span class="integer">{{ price.integerPart.value }}</span>
    <span class="decimal">{{ price.decimalSeparator.value }}{{ price.decimalPart.value }}</span>
    <span class="currency">{{ price.currencySymbol.value }}</span>
  </span>
</template>

Montant reactif

vue
<script setup>
import { ref } from 'vue'
import { usePrice } from '@surgeui/ds-vue'

const amount = ref(49.99)
const { formatted } = usePrice({ amount })

// Quand amount.value change, formatted se met a jour automatiquement
function applyDiscount() {
  amount.value *= 0.8
}
</script>

Multi-devises

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const eur = usePrice({ amount: 29.99, currency: 'EUR', locale: 'fr-FR' })
const usd = usePrice({ amount: 29.99, currency: 'USD', locale: 'en-US' })
const gbp = usePrice({ amount: 29.99, currency: 'GBP', locale: 'en-GB' })
const jpy = usePrice({ amount: 3000, currency: 'JPY', locale: 'ja-JP' })
</script>

<template>
  <ul>
    <li>{{ eur.formatted.value }}</li>  <!-- "29,99 €" -->
    <li>{{ usd.formatted.value }}</li>  <!-- "$29.99" -->
    <li>{{ gbp.formatted.value }}</li>  <!-- "£29.99" -->
    <li>{{ jpy.formatted.value }}</li>  <!-- "¥3,000" -->
  </ul>
</template>

Format personnalise

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const { formatted } = usePrice({
  amount: 0,
  formatValue: (amount, currency, locale) => {
    if (amount === 0) return 'Gratuit'
    return `${amount} ${currency}`
  },
})
</script>

Position du symbole

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const price = usePrice({ amount: 29.99, currency: 'EUR', locale: 'fr-FR' })

// price.isSymbolPrefix.value → false (EUR en fr-FR est en suffixe)
// price.currencySymbol.value → "€"
</script>

Accessibilite

vue
<script setup>
import { usePrice } from '@surgeui/ds-vue'

const price = usePrice({ amount: 1299.99 })

// price.ariaLabel.value → "1 299,99 euros"
// Utilise Intl.NumberFormat avec currencyDisplay: 'name'
</script>

<template>
  <span :aria-label="price.ariaLabel.value" role="text">
    {{ price.formatted.value }}
  </span>
</template>

Composant Price

Pour un affichage de prix complet avec variantes visuelles, slots et accessibilite integree, utilisez le composant Price.

API

Options

OptionTypeDefautDescription
amountnumber | Ref<number> | () => number— (requis)Montant reactif
currencystring'EUR'Code devise ISO 4217
localestring'fr-FR'Locale BCP 47
currencyDisplay'symbol' | 'narrowSymbol' | 'code' | 'name''symbol'Format du symbole
minimumFractionDigitsnumber2Chiffres decimaux min
maximumFractionDigitsnumber2Chiffres decimaux max
formatValue(amount, currency, locale) => stringFormatter personnalise

Retour

ProprieteTypeDescription
formattedReadonly<Ref<string>>Prix formate complet (ex: "1 299,99 EUR")
integerPartReadonly<Ref<string>>Partie entiere (ex: "1 299")
decimalPartReadonly<Ref<string>>Partie decimale (ex: "99")
decimalSeparatorReadonly<Ref<string>>Separateur decimal (ex: ",")
currencySymbolReadonly<Ref<string>>Symbole de la devise (ex: "EUR")
isSymbolPrefixReadonly<Ref<boolean>>true si symbole avant le montant
ariaLabelReadonly<Ref<string>>Texte accessible
rawAmountReadonly<Ref<number>>Montant brut

Performance

  • Memoisation : les instances Intl.NumberFormat sont mises en cache par cle (locale, currency, options) pour eviter les recreations couteuses
  • SSR-safe : Intl.NumberFormat est disponible nativement dans Node.js
  • Reactif : le montant peut etre un Ref, un getter, ou un nombre statique

Publié sous licence MIT.