The evergreen.lpad_number_substrings function attempts to codify numeric
fields within labels. It does this by finding the strings, padding them
to a given size, and replacing them in the source string. For instance:
3 =>
0000000003
15.4 =>
00000000150000000004
The algorithm was fooled by repeated characters, like in 15.1:
15.1 =>
00000000000000000150000000001 INCORRECT
This change will result in the correct value.
Signed-off-by: Dan Pearl <dpearl@cwmars.org>
Signed-off-by: Galen Charlton <gmc@esilibrary.com>
$_$ LANGUAGE SQL IMMUTABLE;
CREATE OR REPLACE FUNCTION evergreen.lpad_number_substrings( TEXT, TEXT, INT ) RETURNS TEXT AS $$
- my $string = shift;
- my $pad = shift;
- my $len = shift;
+ my $string = shift; # Source string
+ my $pad = shift; # string to fill. Typically '0'. This should be a single character.
+ my $len = shift; # length of resultant padded field
my $find = $len - 1;
- while ($string =~ /(?:^|\D)(\d{1,$find})(?:$|\D)/) {
- my $padded = $1;
+ while ($string =~ /(^|\D)(\d{1,$find})($|\D)/) {
+ my $padded = $2;
$padded = $pad x ($len - length($padded)) . $padded;
- $string =~ s/$1/$padded/sg;
+ $string = $` . $1 . $padded . $3 . $';
}
return $string;