PDA

Просмотр полной версии : [Вопрос] Вид числа.



Skyline
21.02.2015, 02:30
Здравствуйте, хотелось бы сделать на сервер, чтобы показатель суммы, был не просто 1000000 а отделялся тысячными и был такого формата. 1.000.000....1.000...100.000.000. Думаю суть ясна что хотелось бы добиться. Подскажите, как такое можно сделать?

Lars Keller
21.02.2015, 02:55
Здравствуйте, хотелось бы сделать на сервер, чтобы показатель суммы, был не просто 1000000 а отделялся тысячными и был такого формата. 1.000.000....1.000...100.000.000. Думаю суть ясна что хотелось бы добиться. Подскажите, как такое можно сделать?

float

Skyline
21.02.2015, 03:56
Что?

$continue$
21.02.2015, 04:15
new Float: mooney_summa = 1.0;
printf("Сумма денег: %f", mooney_summa)

Mazzilla
21.02.2015, 06:54
Тоже интересовался этим вопросом, сейчас с утра решил попробовать и вот что получил. Возможно, в паблике есть что-нибудь попроще - меня хватило только на это)

new number = 12345678910;
main()
{
if(1000 <= number <= 999999)
{
printf("%d.%03d", number/1000, number%1000);
}
else if(1000000 <= number <= 9999999)
{
printf("%d.%03d.%03d", number/1000000, (number/1000)%1000, number%1000);
}
else
{
printf("%d.%03d.%03d.%03d", number/1000000000, (number/1000000)%1000, (number/1000)%1000, number%1000);
}
}

BaBuIIIkaDrifteR
21.02.2015, 10:27
А как сделать что бы не через точку показывало а через пробел ? UpUpUp Довно сам ищу ))

[ForD]
21.02.2015, 12:56
А как сделать что бы не через точку показывало а через пробел ? UpUpUp Довно сам ищу ))

смотрим пост выше,заменяем точечки на пробелы,радуемся.

Skyline
21.02.2015, 13:37
Тоже интересовался этим вопросом, сейчас с утра решил попробовать и вот что получил. Возможно, в паблике есть что-нибудь попроще - меня хватило только на это)

new number = 12345678910;
main()
{
if(1000 <= number <= 999999)
{
printf("%d.%03d", number/1000, number%1000);
}
else if(1000000 <= number <= 9999999)
{
printf("%d.%03d.%03d", number/1000000, (number/1000)%1000, number%1000);
}
else
{
printf("%d.%03d.%03d.%03d", number/1000000000, (number/1000000)%1000, (number/1000)%1000, number%1000);
}
}

Подскажи пожалуйста, как применить это допустим в команду, или это относится ко всем числам в моде?

BaBuIIIkaDrifteR
21.02.2015, 14:25
Да как применить что бы допустим в диалоги MSGBOX показывало: У вас 1.000.000 $

L0ndl3m
21.02.2015, 15:05
Держите:


ConvertNumber(value, ret_str[], ret_size = sizeof(ret_str)) {
format(ret_str, ret_size, "%i", value < 0 ? -value : value);
for (new i = strlen(ret_str); (i -= 3) > 0;) {
strins(ret_str, ".", i, ret_size);
}
if (value < 0) {
strins(ret_str, "-", 0, ret_size);
}
}


Использование:


main()
{
new
money_string[8],
value = 1_000_000; // или value = 1000000, если вам так удобнее

ConvertNumber(value, money_string);

print(money_string);
}

BaBuIIIkaDrifteR
21.02.2015, 15:23
Держите:


stock ConvertNumber(value, copy_str[], size = sizeof(copy_str))
{
format(copy_str, size, "%i", value < 0 ? -value : value);

for(new i = strlen(copy_str) - 3; i > 0; i -= 3)
strins(copy_str, ".", i, size);

if(value < 0)
strins(copy_str, "-", 0, size);
}


Использование:


main()
{
new
money_string[8],
value = 1_000_000; // или value = 1000000, если Вам так удобнее

ConvertNumber(value, money_string);

print(money_string);
}


А как делается что показывалось допустим "playerid" или "clicked"
Это же не будет показывать имено сколько у игрока денег:

format(StringName,sizeof(StringName),"%sИгровые Деньги: %d$.\n",StringName,ConvertNumber(value, money_string);

L0ndl3m
21.02.2015, 15:27
Например:


new
out_string[32],
money_string[12];

ConvertNumber(PlayerInfo[playerid][pMoney], money_string);

format(out_string, 32, "Вы имеете сумму: $%s.", money_string);

Например у игрока есть тот же самый миллион, то вывод будет таковым:

Вы имеете сумму: $1.000.000.

Mazzilla
21.02.2015, 15:34
Держите:


stock ConvertNumber(value, copy_str[], size = sizeof(copy_str))
{
format(copy_str, size, "%i", value < 0 ? -value : value);

for(new i = strlen(copy_str) - 3; i > 0; i -= 3)
strins(copy_str, ".", i, size);

if(value < 0)
strins(copy_str, "-", 0, size);
}


Использование:


main()
{
new
money_string[8],
value = 1_000_000; // или value = 1000000, если Вам так удобнее

ConvertNumber(value, money_string);

print(money_string);
}


stock ConvertNumber(value, copy_str[], size = sizeof(copy_str))
{
format(copy_str, size, "%i", value < 0 ? -value : value);
print(copy_str);
for(new i = strlen(copy_str) - 3; i > 0; i -= 3)
strins(copy_str, ".", i, size);

//if(value < 0)
// strins(copy_str, "-", 0, size);
}
В консоль в любом случае выводит положительное число, поэтому value < 0 ? -value : value бесполезно использовано)
Попробовал valstr, всё хорошо, вроде бы)

stock ConvertNumber(value, copy_str[], size = sizeof(copy_str))
{
valstr(copy_str, value);
for(new i = strlen(copy_str) - 3; i > 0; i -= 3)
strins(copy_str, ".", i, size);
}

L0ndl3m
21.02.2015, 15:35
Mazzilla, пример вашего использования покажите. Вы к размеру массива добавляли единицу под минус?

При использовании:


new
money_string[9],
value = -1_000_000;

ConvertNumber(value, money_string);

print(money_string);

Выводится: -1.000.000.
Может быть я Вас не так понял?

Mazzilla
21.02.2015, 15:38
Mazzilla, пример вашего использования покажите. Вы к размеру массива добавляли единицу под минус?
Ваш же пример и был взят:

main()
{
new
money_string[10],
value = -11_000_000; // или value = 1000000, если Вам так удобнее


ConvertNumber(value, money_string);


print(money_string);
}

L0ndl3m
21.02.2015, 15:39
И что у Вас выводит в данном случае?

Mazzilla
21.02.2015, 15:47
Вы меня не так поняли. Я взял ваш сток, добавил вывод в консоль (print) после превращения числа в строку (format): у меня при отрицательном и положительном входном значении выводило всегда положительное, откуда я сделал вывод, что value < 0 ? -value : value в вашем стоке было использовано за зря. Размер массива для минуса я увеличивал. Мой же сток, где использовал нативную valstr

stock ConvertNumber(value, copy_str[], size = sizeof(copy_str))
{
valstr(copy_str, value);
for(new i = strlen(copy_str) - 3; i > 0; i -= 3)
strins(copy_str, ".", i, size);
}
Выводит всё, как требуется. Вот, к чему я это писал.:blush:

L0ndl3m
21.02.2015, 15:49
Попробуйте использовать функцию с помощью valstr для значения: cellmax ( константа ). Отпишитесь о результатах )

Mazzilla
21.02.2015, 15:55
Попробуйте использовать функцию с помощью valstr для значения: cellmax ( константа ). Отпишитесь о результатах )
Ничего не вывело.:mosking: Ясно, понятно, можете удалить мои сообщения. :blum3:

L0ndl3m
21.02.2015, 16:00
Ничего не вывело.:mosking: Ясно, понятно, можете удалить мои сообщения. :blum3:
Ничего страшного. Просто valstr предназначена для не очень таких уж больших чисел, хотя должно предназначаться именно для того, чтобы конвертировать число в строку. Сервер просто напросто зависает и всё, как будто входит в рекурсию.

Если что, могу посоветовать очень хорошую функцию от Daniel_Cortez'а: Тык (http://pro-pawn.ru/showthread.php?3243). Это замена valstr, и проста в использовании ( как и тот же valstr ).

BaBuIIIkaDrifteR
21.02.2015, 16:02
Ничего страшного. Просто valstr предназначена для не очень таких уж больших чисел, хотя должно предназначаться именно для того, чтобы конвертировать число в строку. Сервер просто напросто зависает и всё, как будто входит в рекурсию.

Если что, могу посоветовать очень хорошую функцию от Daniel_Cortez'а: Тык (http://pro-pawn.ru/showthread.php?3243). Это замена valstr, и проста в использовании ( как и тот же valstr ).

Все на ура работает отлично )!

Mazzilla
21.02.2015, 16:06
Ничего страшного. Просто valstr предназначена для не очень таких уж больших чисел, хотя должно предназначаться именно для того, чтобы конвертировать число в строку. Сервер просто напросто зависает и всё, как будто входит в рекурсию.

Если что, могу посоветовать очень хорошую функцию от Daniel_Cortez'а: Тык (http://pro-pawn.ru/showthread.php?3243). Это замена valstr, и проста в использовании ( как и тот же valstr ).
Фикс функции лежит на вики, хотя я её ещё не тестировал и прекрасно работает)

L0ndl3m
21.02.2015, 16:09
Лежать-то лежит, а вот что внутри фикса:


// valstr fix by Slice
stock FIX_valstr(dest[], value, bool:pack = false)
{
// format can't handle cellmin properly
static const cellmin_value[] = !"-2147483648";

if (value == cellmin)
pack && strpack(dest, cellmin_value, 12) || strunpack(dest, cellmin_value, 12);
else
format(dest, 12, "%d", value), pack && strpack(dest, dest, 12);
}
#define valstr FIX_valstr

Тот же format и используется. :mosking:

Skyline
21.02.2015, 16:50
Как тогда в этом коде например использовать эту функцию:

if (moneys > 0 && playermoney >= moneys)
{
PlayerInfo[giveplayerid][pMoney] += moneys;
PlayerInfo[playerid][pMoney] -= moneys;
format(string, sizeof(string), "Вы передали игроку %s, $%d.", giveplayer, moneys);
PlayerPlaySound(playerid, 1052, 0.0, 0.0, 0.0);
SendClientMessage(playerid, COLOR_GRAD1, string);
format(string, sizeof(string), "Вы получили $%d от %s.", moneys, sendername);
SendClientMessage(giveplayerid, COLOR_GRAD1, string);
log("Pay", string);
PlayerPlaySound(giveplayerid, 1052, 0.0, 0.0, 0.0);
format(string, sizeof(string), "достал деньги и передал их %s." ,giveplayer);
Action(playerid, string);
}

Mazzilla
21.02.2015, 16:53
Второе сообщение на второй странице, видимо, просто так висит. Почему за вас должны делать всё?

L0ndl3m
21.02.2015, 16:53
if (moneys > 0 && playermoney >= moneys)
{
PlayerInfo[giveplayerid][pMoney] += moneys;
PlayerInfo[playerid][pMoney] -= moneys;

new
money_string[12];

ConvertNumber(moneys, money_string);

format(string, sizeof(string), "Вы передали игроку %s, $%s.", giveplayer, money_string);
PlayerPlaySound(playerid, 1052, 0.0, 0.0, 0.0);
SendClientMessage(playerid, COLOR_GRAD1, string);
format(string, sizeof(string), "Вы получили $%s от %s.", money_string, sendername);
SendClientMessage(giveplayerid, COLOR_GRAD1, string);
log("Pay", string);
PlayerPlaySound(giveplayerid, 1052, 0.0, 0.0, 0.0);
format(string, sizeof(string), "достал деньги и передал их %s." ,giveplayer);
Action(playerid, string);
}


На прошлой странице было всё разъяснено...

BaBuIIIkaDrifteR
21.02.2015, 19:42
Способ Londlem работает на отлично! Тестировал лично!
http://s7.hostingkartinok.com/uploads/images/2015/02/594c6e210ad631e9a7c0f5704b26c34c.png (http://hostingkartinok.com/show-image.php?id=594c6e210ad631e9a7c0f5704b26c34c)

Skyline
21.02.2015, 23:49
У меня почему то выводит совершенно другое число. Передаю 100к пишет 49.

BaBuIIIkaDrifteR
22.02.2015, 00:04
У меня почему то выводит совершенно другое число. Передаю 100к пишет 49.

У вас наверно стоит Передал денег: $%d или $%i, а нужно что бы стояло: Передал денег: $%s

Skyline
22.02.2015, 00:19
У вас наверно стоит Передал денег: $%d или $%i, а нужно что бы стояло: Передал денег: $%s

Да, спасибо больше)