Commit | Line | Data |
---|---|---|
11af7272 TC |
1 | package BSE::Util::Format; |
2 | use strict; | |
3 | ||
4 | our $VERSION = "1.000"; | |
5 | ||
6 | sub bse_number { | |
7 | my ($format, $value, $cfg) = @_; | |
8 | ||
9 | $cfg ||= BSE::Cfg->single; | |
10 | my $section = "number $format"; | |
11 | my $comma_sep = $cfg->entry($section, "comma", ","); | |
12 | $comma_sep =~ s/^"(.*)"$/$1/; | |
13 | $comma_sep =~ /\w/ and return "* comma cannot be a word character *"; | |
14 | my $comma_limit = $cfg->entry($section, "comma_limit", 1000); | |
15 | my $commify = $cfg->entry($section, "commify", 1); | |
16 | my $dec_sep = $cfg->entry($section, "decimal", "."); | |
17 | my $div = $cfg->entry($section, "divisor", 1) | |
18 | or return "* divisor must be non-zero *"; | |
19 | my $places = $cfg->entry($section, "places", -1); | |
20 | ||
21 | my $div_value = $value / $div; | |
22 | my $formatted = $places < 0 ? $div_value : sprintf("%.*f", $places, $div_value); | |
23 | ||
24 | my ($int, $frac) = split /\./, $formatted; | |
25 | if ($commify && $int >= $comma_limit) { | |
26 | 1 while $int =~ s/([0-9])([0-9][0-9][0-9]\b)/$1$comma_sep$2/; | |
27 | } | |
28 | ||
29 | if (defined $frac) { | |
30 | return $int . $dec_sep . $frac; | |
31 | } | |
32 | else { | |
33 | return $int; | |
34 | } | |
35 | } | |
36 | ||
37 | 1; |