2017年12月19日 星期二

函數(_commaFormat):讓數字以千分位形式顯示

在製作介面的時候,有關於資金量的顯示,如果是短短的萬元以下,通常我們的人眼辨識沒有什麼問題,當數字位數多一些起來時,往往就會有辨識解讀的困擾(這是一種略帶快樂的麻煩嗎?)

然而 MultiCharts 內建的數字顯示形式的功能,我只看到 :7:0 這類的方式,好像沒有看到以千分位加個逗號的形式?因此,自己就做了個函數,在數字最後要顯示在畫面上時,可以用千分位加逗號的文字型態來表現。



函數(回傳文字類型)名稱:_commaFormat。參數1;要被格式化的數值、參數2:保留顯示的小數位數。
input: price( Numeric ), floatDigits( Numeric );
var: j(0), floating(""), thePrice(""), output("");
array: integer[]("");


floating= NumToStr( price - IntPortion( price ), 10 );
thePrice= NumToStr( intportion(price), 0 );


for j=12 downto 2 begin
  if RightStr( floating, 1 )="0" then
    begin
      floating= LeftStr( floating, j-1 );
      value1= j;
    end
  else 
    begin
      floating= MidStr( floating, 2, j-1 );
      break;
    end;
end;




value2= StrLen( thePrice );

array_setmaxindex( integer, _Digits( price )+2 );
for j=value2 downto 1 begin
  integer[j]= MidStr( thePrice, j, 1 );
end;  

output="";
for j=1 to value2 begin
  if mod(j,3)=0 and j<>value2 then
    output= "," + integer[value2-j+1] + output
  else
    output= integer[value2-j+1] + output;
end;


if floatDigits=0 then floating= "";
if floatDigits>0 then floating= MidStr( floating, 1, floatDigits+1 );


_commaFormat= output + floating;




這是簡單的效果示範:


上面的函數有使用到一個 _digits 的函數,是用來計算"幾位數"的,我去抄了某個內建函數的方式:
input: theNumber( Numeric );
Variables: Res(0); 



     if floor(theNumber/10000000000) > 0 then Res= 10
else if floor(theNumber/1000000000) > 0 then Res= 9
else if floor(theNumber/100000000) > 0 then Res= 8
else if floor(theNumber/10000000) > 0 then Res= 7
else if floor(theNumber/1000000) > 0 then Res= 6
else if floor(theNumber/100000) > 0 then Res= 5
else if floor(theNumber/10000) > 0 then Res= 4
else if floor(theNumber/1000) > 0 then Res= 3
else if floor(theNumber/100) > 0 then Res= 2
else if floor(theNumber/10) > 0 then Res= 1
else if floor(theNumber) > 0 then Res = 0;
        
_Digits = Res;