str_pad вам в помощь. Не запутайтесь в округлениях.
str_pad — Дополняет строку другой строкой до заданной длины
Попробую на пальцах:
length = 50 штук
val = 35 %
первыми выводим звездочек в количестве ceil(50 * 35 / 100)
str_pad(res, ceil(50 * 35 / 100), '*')
А потом добавляем точками до 50
str_pad(res, 50, '.')
В вопросе стоило упомянуть, что вас интересует консольная версия (или text/plain)