// Sqrt // // sqrt(4) => 2, true // sqrt(9) => 3, true // sqrt(not_number) => 0, false // func SqrtFunc(ctx expr.EvalContext, val value.Value) (value.NumberValue, bool) { nv, ok := val.(value.NumericValue) if !ok { return value.NewNumberNil(), false } if val.Err() || val.Nil() { return value.NewNumberNil(), false } fv := nv.Float() fv = math.Sqrt(fv) //u.Infof("??? vals=[%v]", val.Value()) return value.NewNumberValue(fv), true }
// Convert to Number: Best attempt at converting to integer // // tonumber("5") => 5.0 // tonumber("5.75") => 5.75 // tonumber("5,555") => 5555 // tonumber("$5") => 5.00 // tonumber("5,555.00") => 5555 // func ToNumber(ctx expr.EvalContext, item value.Value) (value.NumberValue, bool) { fv, ok := value.ToFloat64(reflect.ValueOf(item.Value())) if !ok { return value.NewNumberNil(), false } return value.NewNumberValue(fv), true }
// Pow: exponents, raise x to the power of y // // pow(5,2) => 25, true // pow(3,2) => 9, true // pow(not_number,2) => NilNumber, false // func PowFunc(ctx expr.EvalContext, val, toPower value.Value) (value.NumberValue, bool) { //Pow(x, y float64) float64 //u.Infof("powFunc: %T:%v %T:%v ", val, val.Value(), toPower, toPower.Value()) if val.Err() || val.Nil() { return value.NewNumberNil(), false } if toPower.Err() || toPower.Nil() { return value.NewNumberNil(), false } fv, _ := value.ToFloat64(val.Rv()) pow, _ := value.ToFloat64(toPower.Rv()) if math.IsNaN(fv) || math.IsNaN(pow) { return value.NewNumberNil(), false } fv = math.Pow(fv, pow) //u.Infof("pow ??? vals=[%v]", fv, pow) return value.NewNumberValue(fv), true }