Строковые числа с предварительным нулём
| |
MrSlap | Дата: Среда, 06 Мая 2015, 01:36 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Здравствуйте. Сабж до безобразия прост.
Код draw_text(x,y,string(date_get_hour(date_current_datetime())) +':'+string(date_get_minute(date_current_datetime())));
Если сейчас час дня и четыре минуты, текст отобразится, как
А ведь так хочется, чтобы было написано 13:04 Подскажите, как это реализовать. Вроде в голове вертится, мол - если число однозначное, то и ноль к нему пририсовывать, а иначе - не надо. Но что-то я не помню кода, считающего количество символов в строковой...
Добавлено (06 мая 2015, 01:36) --------------------------------------------- А, всё, проблема решена вот таким образом
Код x=date_get_hour(date_current_datetime()) y=date_get_minute(date_current_datetime()) z=date_get_second(date_current_datetime())
if x/10 < 1 a='0'+string(x) else a=string(x)
if y/10 < 1 b='0'+string(y) else b=string(y)
if z/10 < 1 c='0'+string(z) else c=string(z)
draw_text(x+100,y+100, a+':' +b+':' +c)
Всё по простому, но от души.
P.S. Если кто знает способ лучше или просто другой хороший способ, прошу привести его в пример. Для общего развития)
Создаю интерактивную повесть.
Сообщение отредактировал MrSlap - Среда, 06 Мая 2015, 01:37 |
|
| |
FadeBaker | Дата: Среда, 06 Мая 2015, 02:01 | Сообщение # 2 |
JavaSE Game Developer
Сейчас нет на сайте
| Вот так еще вроде можно сократить (без сторонних переменных a, b, c): Код x = date_get_hour(date_current_datetime()); y = date_get_minute(date_current_datetime()); z = date_get_second(date_current_datetime()); if (x < 10) x = "0" + string(x); if (y < 10) y = "0" + string(y); if (z < 10) z = "0" + string(z);
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
MrSlap | Дата: Среда, 06 Мая 2015, 02:37 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| FadeBaker, а ну да, тоже самое, только без деления =)
Создаю интерактивную повесть.
|
|
| |
Tymonr | Дата: Среда, 06 Мая 2015, 03:58 | Сообщение # 4 |
With OpenSource forever♥
Сейчас нет на сайте
| Используйте конструкцию
draw_text(x,y,string(date_get_hour(date_current_datetime())) + z < 10 ? ':0' : ':' +string(date_get_minute(date_current_datetime()))); Выполняется проверка на z<10 и если оно верно, выводится :0, иначе просто :
Если вы решили обратиться к нам за помощью, не становитесь в позицию неудачника. И не ведите себя как неудачник. Лучший способ получить быстрый и чуткий ответ, - спрашивать как победитель — спрашивать как человек умный, уверенный в себе и знающий, которому просто понадобилась помощь при решении одной конкретной проблемы. Как правильно задавать вопросы в технических форумах
Сообщение отредактировал Tymonr - Среда, 06 Мая 2015, 04:02 |
|
| |
YellowAfterlife | Дата: Среда, 06 Мая 2015, 10:10 | Сообщение # 5 |
Сейчас нет на сайте
| Цитата Tymonr ( ) Используйте конструкцию
draw_text(x,y,string(date_get_hour(date_current_datetime())) + z < 10 ? ':0' : ':' +string(date_get_minute(date_current_datetime()))); Выполняется проверка на z<10 и если оно верно, выводится :0, иначе просто : В GameMaker [всё ещё] нет поддержки тернарного оператора (condition ? then_value : else_value). Но, в то же время, логические значения представляются аналогично C (1 и 0), что позволяет воспользоваться стандартной функцией string_repeat, string(current_hour) + ":" + string_repeat("0", current_minute < 10) + string(current_minute)
|
|
| |
PoidetLi | Дата: Среда, 06 Мая 2015, 10:31 | Сообщение # 6 |
участник
Сейчас нет на сайте
| Цитата YellowAfterlife ( ) Но, в то же время, логические значения представляются аналогично C (1 и 0), это ещё с времён доса, где define true 1 define false !true
в еюдуго прсхлуренц http://gcup.ru/forum/9-44187-1 мой Project 96
|
|
| |
MrSlap | Дата: Среда, 06 Мая 2015, 22:44 | Сообщение # 7 |
почетный гость
Сейчас нет на сайте
| YellowAfterlife, с этого места чуточку поподробнее, пожалуйста. Чем конкретно занимается string_repeat? =)
Создаю интерактивную повесть.
|
|
| |
FadeBaker | Дата: Среда, 06 Мая 2015, 23:17 | Сообщение # 8 |
JavaSE Game Developer
Сейчас нет на сайте
| Цитата MrSlap ( ) Чем конкретно занимается string_repeat? Возвращает строку, содержащую набор одинаковых символов заданной длины. Например, string_repeat("S", 5) вернет "SSSSS".
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
MrSlap | Дата: Четверг, 07 Мая 2015, 00:01 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| FadeBaker, ага, и цифра появляется слева, правильно? То есть в примере YellowAfterlife, string_repeat("0", current_minute < 10) - ноль будет рисоваться перед числом, если то меньше 10?
И у меня есть обратный вопрос. А если я хочу сократить 2015 до 15? Ну, чтобы это был год в двузначном сокращении - тогда вообще всё красивенько получается =)
Создаю интерактивную повесть.
|
|
| |
FadeBaker | Дата: Четверг, 07 Мая 2015, 00:06 | Сообщение # 10 |
JavaSE Game Developer
Сейчас нет на сайте
| Цитата MrSlap ( ) и цифра появляется слева, правильно? Да, потому что конкатенация строк происходит в соответствующем порядке. Цитата MrSlap ( ) А если я хочу сократить 2015 до 15? Посмотри в справке раздел, где описывается работа со строками. Тебе нужно что-то вроде string_copy. Я точно не знаю, очень давно GM не пользовался.
Уроки по GM Minecraft 2D на GM — Мои проекты — Blood Harvest [2D] — Original Blood Harvest [2D]: Remastered Edition Adventure Craft [2D] — Sandbox Space Shock [2D] — Scroll Shooter Intel® Core™ i5-3570K 3.40 GHz, 8 GB RAM, GeForce GTX 750 Ti, Monitor: LG 23EA63V-P.
|
|
| |
YellowAfterlife | Дата: Четверг, 07 Мая 2015, 00:07 | Сообщение # 11 |
Сейчас нет на сайте
| Цитата MrSlap ( ) Чем конкретно занимается string_repeat? =) Цитата FadeBaker ( ) Возвращает строку, содержащую набор одинаковых символов заданной длины. Например, string_repeat("S", 5) вернет "SSSSS". Если быть более точным, как пытается подсказать название функции, она возвращает указанную строку, повторенную указанное количество раз. show_message(string_repeat("[]", 4)) // "[][][][]" Если второй аргумент менее или равен нулю, функция вернет пустую строку. Условно говоря, функция работает как /// string_repeat(string, count) var r; r = ""; repeat (argument1) r += argument0; return r; но быстрее из-за реализации в нативном коде.
В качестве бонуса по теме: GameMaker 8.1 и ниже включают в себя недокументированное поведение, связанное с обработкой оператора умножения между числом и строкой, show_message("[]" * 4) // (ошибка) show_message(4 * "[]") // "[][][][]" В GameMaker: Studio это было убрано. Но, несмотря на странность и отсутствие совместимости, это позволяло сокращать некоторые фрагменты кода, string(current_hour) + ":" + (current_minute < 10) * "0" + string(current_minute) Или так (рисование текущего количества очков с 8ю цифрами): var s; s = string(score) draw_text(0, 0, (8 - string_length(s)) * "0" + s)
Добавлено: про сокращение, можно сделать string_copy(str, string_length(str) - 1, 2) (1 + длина строки - нужная длина)
Сообщение отредактировал YellowAfterlife - Четверг, 07 Мая 2015, 00:15 |
|
| |
MrSlap | Дата: Четверг, 07 Мая 2015, 23:47 | Сообщение # 12 |
почетный гость
Сейчас нет на сайте
| YellowAfterlife, доходчиво, ещё раз благодарю.
Создаю интерактивную повесть.
|
|
| |
|