diff --git a/src/card.php b/src/card.php index 3e4cf61d..256cb844 100644 --- a/src/card.php +++ b/src/card.php @@ -335,6 +335,29 @@ function getCardHeight(array $params): int return max($minimumHeight, intval($params["card_height"] ?? $defaultHeight)); } +/** + * Format number using locale and short number if requested + * + * @param float $num The number to format + * @param string $localeCode Locale code + * @param bool $useShortNumbers Whether to use short numbers + * @return string The formatted number + */ +function formatNumber(float $num, string $localeCode, bool $useShortNumbers): string +{ + $numFormatter = new NumberFormatter($localeCode, NumberFormatter::DECIMAL); + $suffix = ""; + if ($useShortNumbers) { + $units = ["", "K", "M", "B", "T"]; + for ($i = 0; $num >= 1000; $i++) { + $num /= 1000; + } + $suffix = $units[$i]; + $num = round($num, 1); + } + return $numFormatter->format($num) . $suffix; +} + /** * Generate SVG output for a stats array * @@ -362,9 +385,6 @@ function generateCard(array $stats, array $params = null): string // locale date formatter (used only if date_format is not specified) $dateFormat = $params["date_format"] ?? ($localeTranslations["date_format"] ?? null); - // number formatter - $numFormatter = new NumberFormatter($localeCode, NumberFormatter::DECIMAL); - // read border_radius parameter, default to 4.5 if not set $borderRadius = $params["border_radius"] ?? 4.5; @@ -417,13 +437,15 @@ function generateCard(array $stats, array $params = null): string 19.5 + $heightOffset, ]; + $useShortNumbers = ($params["short_numbers"] ?? "") === "true"; + // total contributions - $totalContributions = $numFormatter->format($stats["totalContributions"]); + $totalContributions = formatNumber($stats["totalContributions"], $localeCode, $useShortNumbers); $firstContribution = formatDate($stats["firstContribution"], $dateFormat, $localeCode); $totalContributionsRange = $firstContribution . " - " . $localeTranslations["Present"]; // current streak - $currentStreak = $numFormatter->format($stats["currentStreak"]["length"]); + $currentStreak = formatNumber($stats["currentStreak"]["length"], $localeCode, $useShortNumbers); $currentStreakStart = formatDate($stats["currentStreak"]["start"], $dateFormat, $localeCode); $currentStreakEnd = formatDate($stats["currentStreak"]["end"], $dateFormat, $localeCode); $currentStreakRange = $currentStreakStart; @@ -432,7 +454,7 @@ function generateCard(array $stats, array $params = null): string } // longest streak - $longestStreak = $numFormatter->format($stats["longestStreak"]["length"]); + $longestStreak = formatNumber($stats["longestStreak"]["length"], $localeCode, $useShortNumbers); $longestStreakStart = formatDate($stats["longestStreak"]["start"], $dateFormat, $localeCode); $longestStreakEnd = formatDate($stats["longestStreak"]["end"], $dateFormat, $localeCode); $longestStreakRange = $longestStreakStart; diff --git a/src/demo/index.php b/src/demo/index.php index 4a0df44f..62f02c4e 100644 --- a/src/demo/index.php +++ b/src/demo/index.php @@ -120,6 +120,12 @@ function gtag() { + + +