#include <a_samp>
#include <sscanf2>
#include <cash>
main()
{
new Float: fFloat = 12345678.96;
new dollar, cent;
printf(FormatNumber(fFloat, 2,',','.')); //formatnumber
printf(FormatNumber(fFloat,0)); //formatnumber
DecimalPoint(fFloat); // Decimal Point
Cash_Truncate(fFloat, dollar, cent); //by eXeGOODER
printf("Simple: %.2f",fFloat); // Обычный Float
}
stock Cash_Truncate(Float: cash, &dollar, ¢)
{
new tmp[16];
format(tmp, sizeof tmp, "%f", cash);
printf("\nCash_Truncate: %s",tmp);
sscanf(tmp,"p<.>dd",dollar,cent);
printf("Cash_Truncate: %d.%d\n",dollar,cent);
}
stock DecimalPoint(Float:money)
{
new str[16];
if(money >= 0)
{
format(str, sizeof(str), "%.2f$", money);
if(1000 <= money < 10000) strins(str, ",", 2, sizeof(str));
else if(10000 <= money < 100000) strins(str, ",", 3, sizeof(str));
else if(100000 <= money < 1000000) strins(str, ",", 4, sizeof(str));
else if(1000000 <= money < 10000000) { strins(str, ",", 2, sizeof(str)); strins(str, ",", 6, sizeof(str)); }
else if(10000000 <= money < 100000000) { strins(str, ",", 3, sizeof(str)); strins(str, ",", 7, sizeof(str)); }
else if(100000000 <= money < 1000000000) { strins(str, ",", 4, sizeof(str)); strins(str, ",", 8, sizeof(str)); }
else if(money >= 1000000000) { strins(str, ",", 2, sizeof(str)); strins(str, ",", 6, sizeof(str)); strins(str, ",", 10, sizeof(str)); }
printf("%.2f",money);
}
else
{
format(str, sizeof(str), "-%.2f$", money-(money*2));
if(-1000 >= money > -10000) strins(str, ",", 3, sizeof(str));
else if(-10000 >= money > -100000) strins(str, ",", 4, sizeof(str));
else if(-100000 >= money > -1000000) strins(str, ",", 5, sizeof(str));
else if(-1000000 >= money > -10000000) { strins(str, ",", 3, sizeof(str)); strins(str, ",", 7, sizeof(str)); }
else if(-10000000 >= money > -100000000) { strins(str, ",", 4, sizeof(str)); strins(str, ",", 8, sizeof(str)); }
else if(-100000000 >= money > -1000000000) { strins(str, ",", 5, sizeof(str)); strins(str, ",", 9, sizeof(str)); }
else if(money <= -1000000000) { strins(str, ",", 3, sizeof(str)); strins(str, ",", 7, sizeof(str)); strins(str, ",", 11, sizeof(str));}
}
return str;
}
Тогда 2 переменных на запись в центах, в БД 1 столбец типа BIGINT в центах + плагин с форматированием в текст 8байтового целого числа и разбиением его на 2 int. Тема с подобным делом уже была, вам остаётся лишь дополнить делением(по модулю) на 100 для извлечения долларов (центов).
|
Идея была в том что бы найти способ сделать DECIMAL под PAWN, как у C# к примеру: https://docs.microsoft.com/ru-ru/dot...ywords/decimal
А не найти альтернативные решения ему. |
Идея была в том что бы найти способ сделать DECIMAL под PAWN, как у C# к примеру: https://docs.microsoft.com/ru-ru/dot...ywords/decimal
А не найти альтернативные решения ему. |
Вопрос: Можно ли как то сделать DECIMAL для PAWN что бы всё работало правильно?
|
stock PrintMoney(value)
{
printf("%d.%d", value / 100, value % 100);
}
FormatSpecifier<\'m\'>(output[], money) {
format(output, sizeof(output), "%d.%d", money / 100, money % 100);
}
format(string, sizeof(string), "Деньги: %m", money);
SendClientMessage(playerid, -1, string);
Хранить деньги в Float - крайне плохая затея. Как минимум потому, что эти значения могут быть не точными.
Самым разумным вариантом будет хранить все деньги в центах, тогда будет возможность иметь на руках максимум $21474836.47, да и выводить эти числа можно довольно просто: PHP Code:
P.S. Если не хочешь париться с выводом значения, как в коде выше, то ты можешь воспользоваться formatex. Добавить новый спецификатор можно так: PHP Code:
PHP Code:
|
Решил попробовать с formatex, но проблема в том что в обычном худе отображается вся сумма: http://i.imgur.com/Bh9J6ft.png
Либо я что то не поняли и сделал неправильно изначально. |
У тебя есть два варианта:
1. Замени стандартный худ своим ТД. 2. Перехватывай GivePlayerMoney и дели сумму на 100, а в переменную записывай всё значение. |
stock Cash_Give(playerid, amount)
{
P[playerid][p_cash] = P[playerid][p_cash]+amount;
GivePlayerMoney(playerid, amount);
printf("amount %i",amount);
}
CMD:money(playerid, params[]){
new user, money,cent;
if(sscanf(params,"p<.>uiI(0)",user,money,cent)) return SendClientMessage(playerid, -1, "Use /money [ID] [cash]");
Cash_Give(playerid, money+cent);
return true;
}
stock Cash_Give(playerid, amount)
{
P[playerid][p_cash] = P[playerid][p_cash]+amount;
if(amount%100 > 0) {
GivePlayerMoney(playerid, amount/100);
printf("2amount %i.%i",amount/100,amount%100);
}
else if(amount/100 == 0){
GivePlayerMoney(playerid, (amount%100)/100);
printf("1amount %i.%i",amount/100,amount%100);
}
}
stock Cash_Give(playerid, amount)
{
P[playerid][p_cash] += amount;
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, P[playerid][p_cash] / 100);
}
Как-то так:
PHP Code:
|
//если не умножать Money на 100, тогда система просто будет считать их за центы
// 1 = 0.1
// 1*100 = 1.0
Cash_Give(playerid, (money*100)+cent);
Спасибо.
Для тех кто столкнётся с подобной проблемой: PHP Code:
|
stock Cash_Give(playerid, dollars, cents)
{
P[playerid][p_cash] += dollars * 100 + cents;
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, P[playerid][p_cash] / 100);
}