Logo

Programming-Idioms

Add the extra character c at the beginning and ending of string s to make sure its length is at least m.
After the padding the original content of s should be at the center of the result.
The length is the number of characters, not the number of bytes.

E.g. with s="abcd", m=10 and c="X" the result should be "XXXabcdXXX".
New implementation

Be concise.

Be useful.

All contributions dictatorially edited by webmasters to match personal tastes.

Please do not paste any copyright violating material.

Please try to avoid dependencies to third-party libraries and frameworks.

Other implementations
  i = (m-len(s))/2
  j = (m - len(s)) - (m-len(s))/2
  s = repeat(c,i) // s // repeat(c,j)
import "encoding/utf8"
import "strings"
n := utf8.RuneCountInString(s)
if n < m {
	nleft := (m - n) / 2
	nright := (m - n) - nleft
	left, right := strings.Repeat(string(c), nleft), strings.Repeat(string(c), nright)
	s = left + s + right
}
while (s.length() < m) s = c + s + c;
uses LazUtf8;
s := UTF8PadCenter(s,m,c);
use feature 'signatures';
my $total_padding = $m-length($s);
if( $total_padding ) {
   my $l = int($total_padding/2);
   my $r = $total_padding-$l;
   $s = join "", ($c x $l), $s, ($c x $r);
}
sub center {
    my ($s, $m, $c) = @_;
    my $slen = length $s;
    return $s if $slen > $m;
    $c //= ' ';
    my $r = $c x $m;
    my $p = int($m/2 - $slen/2);
    substr($r, $p, $slen, $s);
    return $r;    
}

print center("abcd",10,"X");
s = s.center(m, c)
s = s.center(m, c)
let n = (m + s.len())/2;
s = format!("{s:X>n$}");
s = format!("{out:X<m$}");
use pad::{Alignment, PadStr};
s = s.pad(m, c, Alignment::Middle, true);