Я сделал помощник по тегам, который отображает рейтинг от 0 до 5 звезд, включая пол-звезды.
Этот тег отображает пять звезд:
<star-rating rating="10"></star-rating>
значение для rating
может быть любым целым числом от 0 до 10, которое делится пополам в вспомогательном методе, чтобы учесть половину звезд:
public class StarRatingTagHelper : TagHelper
{
public double? Rating { get; set; }
public override void Process(TagHelperContext context, TagHelperOutput output)
{
output.TagMode = TagMode.StartTagAndEndTag;
output.SuppressOutput();
var sb = new StringBuilder();
if (Rating != null)
{
double stars = (double)Rating/2;
sb.AppendFormat($@"<span title='Rating {stars}/5'>");
for (int s = 0; s < stars; s ++)
{
sb.AppendFormat("<span class='fas fa-star'></span>");
}
double dec = stars - Math.Truncate(stars);
if (dec == 0.5)
{
sb.AppendFormat("<span class='fas fa-star-half'></span>");
}
sb.AppendFormat("</span>");
}
else
{
sb.AppendFormat("No rating");
}
output.PreContent.SetHtmlContent(sb.ToString());
}
}
Но в моем методе есть математическая ошибка, которую я могуне найти. Метод производит следующие выходные данные (()
= звезда, (
= половина звезды):
0.5: ()( (one too many)
1.0: () (correct)
1.5: ()()( (one too many)
2.0: ()() (correct)
2.5: ()()()( (one too many)
3.0: ()()() (correct)
3.5: ()()()()( (one too many)
4.0: ()()()() (correct)
4.5: ()()()()()( (one too many)
5.0: ()()()()() (correct)
Здесь есть очевидная закономерность. В чем причина?
Обновление
Я получил его для работы с уродливым обходным путем:
double dec = stars - Math.Truncate(stars);
if (dec == 0.5)
{
for (int s = 1; s < stars; s++)
{
sb.AppendFormat("<span class='fas fa-star text-warning text-outline'></span>");
}
sb.AppendFormat("<span class='fas fa-star-half'></span>");
}
else
{
for (int s = 0; s < stars; s++)
{
sb.AppendFormat("<span class='fas fa-star'></span>");
}
}
Если будетполовина звезды, он запускает один цикл for, если нет, он запускает другой, нарушая принцип DRY ...