JayPee Posted March 16, 2012 Posted March 16, 2012 Script Name: strDivide Description: Allows you to divide two integers. It returns a floating value. Note: the floating value is in string datatype. Version: 1.1 - added division of negative numbers and some variable cleanups Parameters(should be in order): dividend - this should be a number not a string divisor - this should be a number not a string number of decimal digits. Note: You must have this source modification http://rathena.org/board/topic/60307-additional-script-command-for-math-function-absx/page__pid__85826#entry85826. Since absolute script command is not yet added in rathena SVN. function script strDivide { //.@dividend - dividend //.@divisor - divisor //getarg(2) - decimal digits //return values: //Undefined if the divisor is 0 //0 if the dividend is 0 set .@dividend,getarg(0); set .@divisor,getarg(1); if(getarg(2)==0) set .@limit,2; else set .@limit,getarg(2); //Prefix set .@prefix$,""; if(.@dividend<0) { set .@dividend,abs(getarg(0)); if(.@prefix$=="-") set .@prefix$,""; else set .@prefix$,"-"; } if(.@divisor<0) { set .@divisor,abs(getarg(1)); if(.@prefix$=="-") set .@prefix$,""; else set .@prefix$,"-"; } if(.@dividend==.@divisor) { set .@str_decimals$,""; for(set .@i,0; .@i<.@limit; set .@i,.@i+1) { set .@str_decimals$,.@str_decimals$+"0"; } set .@str_result$,"1."+.@str_decimals$; } else if(.@divisor==0) return "Undefined"; else if(.@dividend==0) { set .@str_decimals$,""; for(set .@i,0; .@i<.@limit; set .@i,.@i+1) { set .@str_decimals$,.@str_decimals$+"0"; } set .@str_result$,"0."+.@str_decimals$; } else { if(.@dividend>.@divisor) { set .@tmp_Counter,0; //Counter set .@result,0; //Reset value to zero set .@result,.@dividend; //ex 10(dividend) - 3(divisor) = 7(result) do { if((.@result-.@divisor)>=0) { set .@result,.@result-.@divisor; set .@tmp_Counter,.@tmp_Counter+1; } else break; }while(.@result>0); set .@str_result$,""; set .@str_result$,.@str_result$+""+.@tmp_Counter; if(.@result >= 1) { //If the remainder is greater or equal to 1 set .@start,0; //Start indicator set .@str_decimals$,""; //temporary holder of the decimal values while(.@start < .@limit) { set .@tmp_Counter,0; //Counter set .@result,.@result*10; //Remainder(.@result) * 10 do { if((.@result-.@divisor)>=0) { set .@result,.@result-.@divisor; set .@tmp_Counter,.@tmp_Counter+1; } else break; }while(.@result>0); //Append the decimal set .@str_decimals$,.@str_decimals$+""+.@tmp_Counter; //If there is a remainder check the limit of decimal digit //else break the result if(.@result>=1) set .@start,.@start+1; else break; } if(getstrlen(.@str_decimals$)>=.@limit) set .@str_decimals$,substr(.@str_decimals$,0,.@limit-1); else { for(set .@i,getstrlen(.@str_decimals$); .@i<.@limit; set .@i,.@i+1) { set .@str_decimals$,.@str_decimals$+"0"; } } set .@str_result$,.@str_result$+"."+.@str_decimals$; } else { //If the remainder is equal to zero nothing to loop set .@str_decimals$,""; for(set .@i,0; .@i<.@limit; set .@i,.@i+1) { set .@str_decimals$,.@str_decimals$+"0"; } set .@str_result$,.@str_result$+"."+.@str_decimals$; } } else { //The divisor is greater than the dividend set .@str_result$,"0"; set .@str_decimals$,""; //Multiply the .@dividend to ten, hundred, thousand set .@tmp_multi,1; set .@start,0; do { set .@result,(.@dividend)*(pow(10,.@tmp_multi)); if(.@result<.@divisor) set .@str_decimals$,.@str_decimals$+"0"; set .@tmp_multi,.@tmp_multi+1; }while(.@result<=.@divisor); if(.@result==.@divisor) set .@str_decimals$,"1"; else if(.@result>.@divisor) { while(.@start<.@limit) { set .@tmp_Counter,0; do { if((.@result-.@divisor)>=0) { set .@result,.@result-.@divisor; set .@tmp_Counter,.@tmp_Counter+1; } else break; }while(.@result>0); if(.@result>0){ set .@str_decimals$,.@str_decimals$+""+.@tmp_Counter; set .@tmp_multi,1; do { set .@result,(.@result)*(pow(10,.@tmp_multi)); if(.@result<.@divisor) set .@str_decimals$,.@str_decimals$+"0"; set .@tmp_multi,.@tmp_multi+1; }while(.@result<.@divisor); } else { set .@str_decimals$,.@str_decimals$+""+.@tmp_Counter; break; } set .@start,.@start+1; } } if(getstrlen(.@str_decimals$)>=.@limit) set .@str_decimals$,substr(.@str_decimals$,0,.@limit-1); else { for(set .@i,getstrlen(.@str_decimals$); .@i<.@limit; set .@i,.@i+1) { set .@str_decimals$,.@str_decimals$+"0"; } } set .@str_result$,"0."+.@str_decimals$; } } return .@prefix$+""+.@str_result$; } Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.