我有一个GetQuantity函数,该函数返回一个小数。在某些情况下,我不希望返回任何内容,即返回空字符串,以便显示“”。
实际行为:
期望的行为:
在情况3中,我显然可以返回-1.0之类的东西,但这不是我所需要的。
FUNCTION GetQuantity RETURNS DECIMAL(INPUT num AS INTEGER):
DEFINE VARIABLE quantity AS DECIMAL NO-UNDO FORMAT "->,>>>,>>9.9<<<<<<<<".
quantity = 3.3. //initialization is neccessary as IRL my value is initialized
IF num = 1 THEN DO:
RETURN 1.0.
END.
ELSE IF num = 2 THEN DO:
RETURN 2.0.
END.
RETURN quantity. //base case return ' '
END.
DISPLAY GetQuantity(3)
答案 0 :(得分:5)
一种方法是返回?如果是默认值,请在输出例程中进行处理。
是吗?也是计算失败的结果(除以0),这可能很危险。
另一种选择是编写一个具有Value属性,Default标志和ToString()覆盖的类。
BLOCK-LEVEL ON ERROR UNDO, THROW.
USING Progress.Lang.*.
CLASS Test.SampleValueHolder:
DEFINE PUBLIC PROPERTY Value AS DECIMAL NO-UNDO
GET.
PRIVATE SET.
DEFINE PUBLIC PROPERTY IsDefault AS LOGICAL NO-UNDO
GET.
PRIVATE SET.
CONSTRUCTOR PUBLIC SampleValueHolder (pdeValue AS DECIMAL,
plDefault AS LOGICAL):
ASSIGN THIS-OBJECT:Value = pdeValue
THIS-OBJECT:IsDefault = plDefault .
END CONSTRUCTOR.
METHOD PUBLIC OVERRIDE CHARACTER ToString ():
IF THIS-OBJECT:IsDefault THEN
RETURN "" .
ELSE
RETURN STRING (THIS-OBJECT:Value, "->,>>>,>>9.9<<<<<<<<") .
END METHOD.
END CLASS.
现在,您可以将RETURN NEW SampleValueHolder(1.0,FALSE)或RETURN NEW SampleValueHolder(?,TRUE)转换为类型Test.SampleValueHolder的变量。
每当显示该值的STRING()时,您都将获得格式化值或默认值“”。
答案 1 :(得分:3)
上述Mike的另一种解决方案是更改getQuantity()以返回一个Character值,而不是当前的十进制值。尽管这当然会导致修复所有调用点的大量工作。我不知道它的使用范围。
此外,如果您所处的条件数量比您所显示的要多,那么CASE的维护要比许多IF语句容易得多。像这样:
FUNCTION GetQuantity RETURNS CHARACTER(INPUT num AS INTEGER):
DEFINE VARIABLE quantity AS CHARACTER NO-UNDO INITIAL "3.3".
CASE num:
WHEN 1 THEN quantity = "1.0".
WHEN 2 THEN quantity = "2.0".
OTHERWISE quantity = "".
END CASE.
RETURN STRING(quantity).
END.
DISPLAY GetQuantity(3).