Hi for all readers,
I need to resolve next issue:
For instance, if I have number with value 1545.445551122101, I would want to round up on only two decimals after point and all this divided in quarters i.e. 1234.13455… would be 1234.00 and 1234.45661… would be 1234.50.
Additionally I would like to know how I could make to point out first group of No i.e. 1234.50 I would like to get 1.234.50.
I hope that I was clear in my Explication,
Thanks in advance
Here's some code that will convert a number to the nearest quarter.
x = Math.round(x*4)/4;
This will round-down to nearest quarter.
x = Math.floor(x*4)/4;
To add trailing zeros will require a bit more work: e.g.
if (x - Math.floor(x) == .5) x += "0";
else if (x - Math.floor(x) == 0) x += ".00";
Sample usage:
code:
// make a random number & show it
x = Math.random()*100+Math.random();
trace(x);
// Round to nearest quarter and show it
x = Math.round(x*4)/4;
if (x - Math.floor(x) == .5) x += "0";
else if (x - Math.floor(x) == 0) x += ".00";
trace(x);
I didn't understand the last part of your question (about inserting an extra period?)
The method I used to add the trailing zeros is special cased for your problem. A more generic algorithm that adds trailing zeros would look like this:
// x is the number you wish to add trailing zeros for
var ix = Math.floor(x);
var fx = x - ix;
fx = String(fx*100+100).substr(1,2);
x = ix + '.' + fx;
trace(x);
JBurn,
My friend if i may call you friend; you helped me so many times till now, but last one was grandiose (short and clear). Now a result that I get from the flash looks much better.
You told me that you didn’t understand the last part of question, so I will try to explain better; note: I’m poor in Action Script, cause I depreciated it and spend a lot of time in learning ASP, SQL Server and VB.
Whatever, I’m continuing: Macedonian money are denars that are very cheap regard to dollars or Euros, what means that has a lot of numbers, i.e. 1 dollar is equal to 55 denars. So I often get number larger then 100.000.00. So I would like to format numbers as follow: 12.045.50 or 1.450.50 instead 14500.50 or 1254.50.
I hope that now I’m clearer and you could help me this time as well.
Thanks in advance,
Jugo
Jbum, friend,
I have to tell you about purpose of app, to preserve misunderstandings between us. I'm employed in the Bank on position Internal auditing. So I’m trying to make a useful app that would be used only from myself. Till now we did checking loans only by hands and nothing more, and it was takings me a lot of time. Now I hope that will cut the time for half at least. Means nothing that I would sell, so know that I very appreciate your help.
I’m telling you this because you may see this like: - so I told him at least half code and he has whole app now. So don’t worry I’m really thankful person.
One more time thanks Jburn
Look Jbum,
Instead your cents we have deni it's the same 100th parts of denars as your cents are 100th parts of dollar.
So i could use comma for denars as well.
Only deni need to be separated with period.
Thanks a lot
EncodeCurrency = function(x)
{
var ix = Math.floor(x);
var fx = x - ix;
fx = String(fx*100+100).substr(1);
if (ix >= 1000) {
ix = String(ix);
var len = ix.length;
var ngroups = 1 + Math.floor((len-4)/3);
var ox = '';
while (ngroups--)
{
ox = kDelimiter + ix.substr(len-3,3) + ox;
ix = ix.substr(0,len-3);
len -= 3;
}
ix += ox;
}
return ix + '.' + fx;
}
x = Math.random()*10000000+Math.random();
trace(x);
x = RoundToQuarter(x);
trace('nearest quarter:' + x);
Wow,it works great,
It's too many for tonight for my heart .
It works brilliant, but I don’t know to apply this function on all elements in array myData.
Do I have to make another array ahead of x = RoundToQuarter(x); for instance:
x = [z, k, a, c, b]; so after call the function for the whole array, please explain me this one yet.
Thanks one more time Jbum, i appreciate it a lot,
Jugo
I thought that already sent you app, but never mind here is; I enclosed you whole app and AS. I forgot to tell you that denars must be increased if deni reach last Quarter, means 4th quarter and round up on .00 (then denars need to increase for 1).
i.e. 123,123,78925 needs to be 123,124.00
I hope that now you could find (from .FLA) the reason of applying EncodeCurrency, function to four values, and because of i need an array.
Thanks a lot (it was for 100th time maybe ),
Jugo
Sorry jbum,
I took a look at your code below and i'm seeing the code that confute my last petition (round the number and increase last values). I hope the rest of question is still valid.
To not confusing you additionally:
instead call function particulary for each member of my array that make table i want to call function to new array wich would consist all members.
i.e.
to preserve this:
It seems to me as I’m talking with my self only.
But never mind, relevant is only result that I’m getting from here, right?
So Jbum, I could tell you that I found solution for all my dilemmas.
code:
myData = [];
for (i=0; i < rati+1; i++){
m=i+1;
k=z*p/1200;
b = a-k;
//this is for separating integers with periods;
k= RoundToQuarter(k);
b= RoundToQuarter(b);
a= RoundToQuarter(a);
z= RoundToQuarter(z);
so only that is rest to me is figuring a dates of payment, means if I type some date into
Release field i.e. 30.04.04 it need to continue providing next payment dates on every last day of the month. Regard to above typed date could be for next months:
31.05.04, 30.06.04 etc. but Also I don’t know what would happen if I need compute February cause it has 28 days and 29 in Leap Year.
Do you have any idea about this?
Thanks a lot
Jugo
Here's some sample code for working out a payment schedule.
code:
// Utility function to determine if leap year
isLeapYear = function(year)
{
return ( year % 4 == 0 &&
(year % 100 != 0 || year % 400 == 0) );
}
// Utility function to determine number of days in month
// (including leap years)
kmDays = [31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31];
getMonthDays = function(year,mNbr) // month is from 0 - 11
{
return kmDays[mNbr] + (mNbr == 1 && isLeapYear(year));
}
// Sample Usage
// print end of month for next 52 pay periods
var dat = new Date();
yr = dat.getFullYear(); // get current year
mn = dat.getMonth(); // get current month (0-11)
// loop over number of pay periods
for (var i = 0; i < 52; ++i)
{
var dat = new Date(yr,mn,getMonthDays(yr,mn));
var datString = dat.getFullYear() + '.' + (dat.getMonth()+1) + '.' + dat.getDate();
trace(i + ": " + datString);
// increment month - if we reach end o f year, reset month and increment year
if (++mn >= 12) {
mn = 0;
yr++;
}
}
Jbum,
I must tell you that you are flawless. Also I saw your web site and wow!!!.. (if all those things are your job you have spent lot of time in programming). Only code without stage using, I have no words for it. I didn’t know that AS is so powerful, I knew only for VB, C/C++ and JAVA, and fact that they are capable for such a things.
Enough with Glorify, let’s back in real world, if you don’t mind.
The script above is great but it’s workable for another purpose (maybe I’ll use it latter in my second project that I’ve been planning), but my present project want another approaching to the problem. I don’t need getData() object cause I will type the dates by hand, so regard to it dates will continue with further months, years and days considering the embedded dates by myself.
I try to assuming something and I’m not sure to send whole code but I will send a little one that could be workable if someone guru use it properly.
code:
//otplata is an input Text where I’m typing date in format 30.05.04 where last group (04) present loan disbursement year;
If (otplata.substring ( 6, 7 ) eq 96&&00&&04&&08){
February = 29;
}
I’m checking only short-term loans so I don’t need to know Leap Years before and after period of six maybe seven years.
Thanks in advance,
JUGO
I'm not sure I understand, but I think you're saying you need to start with a user-input date, in the form: YY.MM.DD, which is stored in the string variable otplata.
You should replace the lines:
var dat = new Date();
yr = dat.getFullYear(); // get current year
mn = dat.getMonth(); // get current month (0-11)
in my code above with this snippet:
// read the date from a string
datAry = otplata.split('.');
yr = datAry[0] + 2000; // full year
mn = datAry[1] - 1; // month in 0-11 format
Then it will compute the pay periods from that time on forward. Change the number 52 to the number of actual pay periods you want.
Don't worry about your leap-year restriction - just use full years (2004) for the computation, and the code will work for quite a long time to come.
It work fine and I’m sure that we would find very fast its defect. I tested all possible that I have knowledge about AS. GetMonth() works well except I would like to put zero ahead of number if is less than 10, but years don’t work naught as we expect; maybe reason is that I type date in format (this is like I see result in date field) 16.04.04, means I don’t embed whole year or just one number but for 2004 I use .04 and European format of date is:
DD/MM/YY so maybe it was one that confusing you.
Thanks again
I forgot to point out that result in my app in field datString is:31.11.112002
here is the whole script with last changing:
code:
// Utility function to determine if leap year
isLeapYear = function(year){
return ( year % 4 == 0 &&
(year % 100 != 0 || year % 400 == 0) );
}
// Utility function to determine number of days in month
// (including leap years)
kmDays = [31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31];
getMonthDays = function(year,mNbr) {
return kmDays[mNbr] + (mNbr == 1 && isLeapYear(year));
}
// Sample Usage
// print end of month for next 52 pay periods
// read the date from a string
datAry = otplata.split('.');
yr = datAry[2] + 2000; // full year
mn = datAry[1] - 1; // month in 0-11 format
//Round up the numbers;
kDelimiter = '.';
RoundToQuarter = function(x)
{
return Math.round(x*2)/2;
}
EncodeCurrency = function(x)
{
var ix = Math.floor(x);
var fx = x - ix;
fx = String(fx*100+100).substr(1);
if (ix >= 1000) {
ix = String(ix);
var len = ix.length;
var ngroups = 1 + Math.floor((len-4)/3);
var ox = '';
while (ngroups--)
{
ox = kDelimiter + ix.substr(len-3,3) + ox;
ix = ix.substr(0,len-3);
len -= 3;
}
ix += ox;
}
return ix + '.' + fx;
}
// drawing the table;
function CreateTable(thename, x, y, width, height, no_of_rows, no_of_columns, data, parent){
c=0;
for(i=0;i<no_of_rows;i++){
for(j=0;j<no_of_columns;j++){
// Create the new name for the text field
__name=thename+"_"+i+"_"+j;
// Create the text field
parent. createTextField(__name,c++,j*width+x,i*height+y,wi dth,height);
// Set the data and other settings
temp=parent[__name];
temp.text=data[i][j];
temp.background=false;
temp.border=false;
myformat = new TextFormat();
myformat.color = 0x000000;
myformat.font = "Arial";
myformat.size = 9;
myformat.align = "right";
temp.setTextFormat(myformat);
}
}
}
//insert values into tables
var p = stapka;
var r = 1+p/1200;
var z = iznos;
var a = z*Math.pow(r,rati)*(r-1)/(Math.pow(r, rati)-1);
myData = [];
for (i=0; i < rati+1; i++){
m=i+1;
k=z*p/1200;
b = a-k;
//spliting a numbers;
k= RoundToQuarter(k);
b= RoundToQuarter(b);
a= RoundToQuarter(a);
z= RoundToQuarter(z);
var dat = new Date(yr,mn,getMonthDays(yr,mn));
var datString = dat.getDate() + '.' + (dat.getMonth()+1) + '.' + dat.getFullYear();
if (++mn >= 12) {
mn = 0;
yr++;
}
myData[i] = [m, datString, EncodeCurrency(z), EncodeCurrency(b), EncodeCurrency(k), EncodeCurrency(a)];
z=z-b;
}
CreateTable("MyTable", 50, 120, 100, 14, rati, 6, myData, this);