将负值传递给函数q/kdb时,函数返回不需要的值

将负值传递给函数q/kdb时,函数返回不需要的值,kdb,Kdb,函数在传递给它时应返回相同的负值 我不能让你的代码按原样工作,但我可以告诉你,你的负数问题是因为你使用的是floor,而floor在负数方面没有给你正确的“十进制前”成分: q)floor -0.331 1234.56 1.2345 18908.46 1234561 -1233.544 -1 1234 1 18908 1234561 -1234 使用相同函数的简单解决方案可能是执行以下操作: ?[col>0;FormatNumber[col;5];"-",/:Fo

函数在传递给它时应返回相同的负值



我不能让你的代码按原样工作,但我可以告诉你,你的负数问题是因为你使用的是
floor
,而
floor
在负数方面没有给你正确的“十进制前”成分:

q)floor -0.331 1234.56 1.2345 18908.46 1234561 -1233.544
-1 1234 1 18908 1234561 -1234
使用相同函数的简单解决方案可能是执行以下操作:

?[col>0;FormatNumber[col;5];"-",/:FormatNumber[abs col;5]]
使用
.Q.f
.Q.fmt
-27,可能有一种更干净的方法来实现这一点。或者,这种方法只使用字符串操纵(可能只适用于小数字,例如股票价格)


你能详细说明你想要函数做什么吗?可能有更简单(且内置)的方法来实现您想要的,由输入col组成的字符串列表,小数点左侧用逗号分隔符分隔1000秒,右侧用numdeclices数字@terrylyynch如果我传递一个带15位小数的负值,例如:[登记-0.229;15],它应该返回与传递给它相同的负值,但作为字符串例如:“-0.029”我需要一个if条件来处理负值并作为string返回我想检查是否有条件将负值传递给Formatnumber[-0.229;15],则它应返回与字符串相同的负值,小数点后15位。@TerrySync将FormatNumber作为包装函数,然后调用子函数。
FormatNumber:{[col;numDecimal]?[col>0;FormatNumberSub[col;numDecimal];“-”,/:FormatNumberSub[abs col;numDecimal]}
其中
FormatNumberSub
包含您的原始逻辑它需要一个列表,而不是一个原子:
prettyPrintNums[(),-0.331;15]
它已经适用于正数和负数,它不需要if-else
FormatNumber:{[col;DecimalPlaces]““sv'@'[;0;{reverse”,“sv 0n3#reverse x}]”“vs'neg[0 |-[;DecimalPlaces]count”[s]-[1+s]:]_'s:string col};
q)prettyPrintNums:{"."sv'@'[;0;{reverse","sv 0N 3#reverse x}]"."vs'neg[0|-[;y]count'[s]-1+s?\:"."]_'s:string x};
q)prettyPrintNums[-0.331 1234.56 1.2345 18908.46 1234561.0 -1233.544;2]
"-0.33"
"1,234.56"
"1.23"
"18,908.46"
"1,234,561"
"-1,233.54"
q)prettyPrintNums[-0.331 1234.56 1.2345 18908.46 1234561.0 -1233.544;5]
"-0.331"
"1,234.56"
"1.2345"
"18,908.46"
"1,234,561"
"-1,233.544"