Function to Convert decimals to percentage in KDB

297 Views Asked by At
`pct:157.35686
func[`pct]
func::{[x]
    ?[x>1;x-100;100*x]}

The result should be as 57.35%

`pct:0.804892
func[`pct]
func::{[x]
    ?[x>1;x-100;100*x]}

The result should be as 80.48%

2

There are 2 best solutions below

0
SJT On BEST ANSWER

Your use of Vector Conditional ? suggests your argument might be a vector†.

q){?[x>1;x-100;x*100]} 157.35686 0.804892
57.35686 80.4892

The specimen answers are rounded down to two decimal places.

q).01 xbar {?[x>1;x-100;x*100]} 157.35686 0.804892
57.35 80.48

The specimen answers are suffixed with percentage signs: cast them to strings. Project Join onto "%" to derive unary ,[;"%"] which you can apply with each.

q),[;"%"] each string .01 xbar {?[x>1;x-100;x*100]}157.35686 0.804892
"57.35%"
"80.48%"

† For an atom argument use the ‘ternary conditional’ control structure Cond.

q){$[x>1;x-100;x*100]}157.35686
57.35686
q){$[x>1;x-100;x*100]}0.804892
80.4892

Why? Because Vector Conditional is an operator and all three of its arguments are evaluated. That is, whatever the result of x>1, both x-100 and x*100 are evaluated. With Cond, either the second or third expression is evaluated; never both.

In this example, the cost is of course negligible. In other cases the expressions in the second and third arguments could be expensive.

0
Maurice Lim On
`pct:157.35686

is wrong because you are not assigning a variable.

func:{[x]
    ?[x>1;x-100;100*x]}
pct:0.804892
func[pct]
pct:157.35686
func[pct]

should work for your case. I removed the global assign for the function as well.