Чтобы сгенерировать календарь в виде таблицы, вам нужно создать сетку строк из шести столбцов x 6, чтобы разрешить все возможные месяцы, поэтому цикл должен повторяться 42 раза (а не количество дней в месяце), где первый ячейка - последнее воскресенье предыдущего месяца (если текущий месяц не начинается в воскресенье)
Чтобы вычислить дату в первой ячейке, используйте
DateTime startDate = firstDayOfTheMonth.AddDays(-(int)firstDayOfTheMonth.DayOfWeek);
Затем, чтобы сгенерировать таблица в вашем представлении
<table>
<thead>
.... // add day name headings
</thead>
<tbody>
<tr>
@for (int i = 0; i < 42; i++)
{
DateTime date = startDate.AddDays(i);
if (i % 7 == 0 && i > 0)
{
@:</tr><tr> // start a new row every 7 days
}
<td>@date.Day</td>
}
</tr>
</tbody>
</table>
Вы также можете стилизовать любые дни не в текущем месяце по-разному, и в этом случае вы можете условно добавить имя класса, например
if (startDate.Month == getDate.month)
{
<td class="current">@date.Day</td>
}
else
{
<td>@date.Day</td>
}
str = "*".repeat(str.length());
Примечание. Это заменяет новые строки \n
на *
. Если вы хотите сохранить \n
, см. Решение ниже.
str = str.replaceAll(".", "*");
Этот сохраняет строки новой строки.
Чтобы заменить новые строки на *
, а также на Java 10 и более ранних версиях, вы можете использовать:
str = str.replaceAll("(?s).", "*");
(?s)
не соответствует чему-либо, кроме активизации DOTALL
, что делает .
также соответствовать \n
.
Как abt создать новую строку с числом * = числом последнего символа строки?
StringBuffer bf = new StringBuffer();
for (int i = 0; i < source.length(); i++ ) {
bf.append('*');
}
Могут быть другие более быстрые / лучшие способы сделать это, но вы можете просто использовать строковый буфер и цикл for:
public String stringToAsterisk(String input) {
if (input == null) return "";
StringBuffer sb = new StringBuffer();
for (int x = 0; x < input.length(); x++) {
sb.append("*");
}
return sb.toString();
}
Если ваше приложение однопоточное, вы можете использовать StringBuilder вместо этого, но он не является потокобезопасным.
Я не уверен, что это может быть быстрее:
public String stringToAsterisk(String input) {
if (input == null) return "";
int length = input.length();
char[] chars = new char[length];
while (length > 0) chars[--length] = "*";
return new String(chars);
}
Без какой-либо внешней библиотеки и без вашего собственного цикла вы можете сделать:
String input = "Hello";
char[] ca = new char[input.length()];
Arrays.fill(ca, '*');
String output = new String(ca);
BTW, как Arrays.fill()
, так и String(char [])
очень быстрые.
System.out.println("foobar".replaceAll(".", "*"));
Не используйте регулярное выражение вообще, считайте длину строки и возвращайте соответствующее число звезд.
Обычная Java & lt; 8 Версия:
int len = str.length();
StringBuilder sb = new StringBuilder(len);
for(int i = =; i < len; i++){
sb.append('*');
}
return sb.toString();
Обычная Java> = 8 Версия:
int len = str.length();
return IntStream.range(0, n).mapToObj(i -> "*").collect(Collectors.joining());
Использование Guava :
return Strings.repeat("*", str.length());
// OR
return CharMatcher.ANY.replaceFrom(str, '*');
Используя Commons / Lang :
return StringUtils.repeat("*", str.length());
public String allStar(String s) {
StringBuilder sb = new StringBuilder(s.length());
for (int i = 0; i < s.length(); i++) {
sb.append('*');
}
return sb.toString();
}