Skip to content

Commit

Permalink
Improve big integer number formatting (#75)
Browse files Browse the repository at this point in the history
  • Loading branch information
antonkomarev authored Sep 17, 2023
1 parent 97f5f82 commit 8c49635
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 24 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,7 @@ You can overwrite default `Profile views` text with your own label.

You can provide a `base` number to add to the counter.
This is useful if you are migrating from another service.

For example, a user with 1000 views on another service who wants to migrate to GHPVC will use the following url
to ensure the 1000 views are accounted for:
```markdown
Expand All @@ -128,7 +129,7 @@ This project provides minimalistic counter only. Use [Ÿ HŸPE] service if you w

### How to reset counter?

To reset counter you should login to the [Ÿ HŸPE] service and then you will be able to reset counter on the https://yhype.me/ghpvc page.
To reset counter you should log in to the [Ÿ HŸPE] service, and then you will be able to reset counter on the https://yhype.me/ghpvc page.

### Why does the counter increase every time the page is reloaded?

Expand Down
4 changes: 2 additions & 2 deletions public/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,13 @@
);
if ($baseCount !== '0') {
$count = $count->plus(
Count::ofString($baseCount)
Count::ofString($baseCount),
);
}

echo $badgeImageRenderer->renderBadgeWithCount(
$badgeLabel,
$count->toInt(),
$count,
$badgeMessageBackgroundFill,
$badgeStyle,
);
Expand Down
17 changes: 15 additions & 2 deletions src/BadgeImageRendererService.php
Original file line number Diff line number Diff line change
Expand Up @@ -36,11 +36,11 @@ public function __construct()

public function renderBadgeWithCount(
string $label,
int $count,
Count $count,
string $messageBackgroundFill,
string $badgeStyle
): string {
$message = number_format($count);
$message = $this->formatNumber($count->toInt());

return $this->renderBadge(
$label,
Expand Down Expand Up @@ -84,4 +84,17 @@ private function renderBadge(
Badge::DEFAULT_FORMAT,
);
}

/**
* This method required because of native `number_format`
* method has big integer format limitation.
*/
private function formatNumber(
int $number
): string {
$reversedString = strrev(strval($number));
$formattedNumber = implode(',', str_split($reversedString, 3));

return strrev($formattedNumber);
}
}
50 changes: 31 additions & 19 deletions src/Count.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,50 @@ final class Count
private int $count;

public function __construct(
float $count
int $count
) {
$this->count = $count;

Assert::lessThan(
$count,
self::MAX_COUNT,
'The maximum number of views has been reached'
$count,
self::MAX_COUNT,
'The maximum number of views has been reached',
);
$this->count = intval($count);
Assert::greaterThanEq(
$count,
0,
"Received a negative number of views"
$count,
0,
'Number of views cannot be negative',
);
}

public static function ofString(string $countStr): self
{
Assert::digits(
$countStr,
'The base count must only contain digits'
);
$count = floatval($countStr);
return new self($count);
public static function ofString(
string $value
): self {
Assert::digits(
$value,
'The base count must only contain digits',
);
$count = intval($value);

return new self($count);
}

public function toInt(): int
{
return $this->count;
}

public function plus(self $count): self
{
return new self($this->toInt() + $count->toInt());
public function plus(
self $that
): self {
$sum = $this->toInt() + $that->toInt();

if (!is_int($sum)) {
throw new \InvalidArgumentException(
'The maximum number of views has been reached',
);
}

return new self($sum);
}
}

0 comments on commit 8c49635

Please sign in to comment.