我最近开始使用Power Apps,我正在构建的第一个应用程序之一是身体质量指数(BMI)计算器。我可以将它设置为自动从千克转换为磅,从厘米转换为英尺。
我现在面临的问题是使用If
或Switch
语句输出结果来显示BMI类别:
BMI Categories:
Underweight = <18.5
Normal weight = 18.5–24.9
Overweight = 25–29.9
Obesity = BMI of 30 or greater
我打算使用的公式是
BMI = 703* (weight/(Height^2))
这是我使用的逻辑
Set(VarResult,If(tx1.Text/(tx2.Text^2)*703)=<18.5,"underweight")
if(VarResult>18.5,"Normal")
if(VarResult>=24.5,"Overweight")
if(VarResult>30, "Obese"))
感谢您对if语句的协助,错误与求解if语句后的计算有关。正确的逻辑是
With(
{res:Value(tx1.Text)/(Value(tx2.Text)^2)*10000},
If(
res>= 30, "Obese",
res> 25 && res< 29.9, "Overweight",
res> 18.5 && res< 24.9, "Normal",
res<= 18.4, "Underweight"
)
)
谢谢大家。
正确的解决方案
注意:我使用名称
WeightInput
和HeightInput
为我的输入,它们的类型是文本输入。如果您的配置不同,您可以修改您的公式以获得正确类型的值。
注意为了使这个过程更清晰,我将为每一步使用单独的label元素。然后我将通过标签的名称访问前一步的值。
步骤1:获取weight作为number
公式WeightInput.Text
返回文本值。我们需要使用Value()
函数将其转换为数字:
Value(WeightInput.Text)
我把它保存到标签名为WeightData
。
步骤2:获取高度
的平方值我们已经知道如何得到number。让我们在添加Power()
函数时重复相同的操作(在这种情况下指数值将为2):
Power(Value(HeightInput.Text),2)
保存到标签SquaredWeight
步骤3:计算BMI现在我们可以使用我们保存的标签来计算BMI值:
703*(WeightData/SquaredWeight)
我保存为BMI。
步骤4:返回文本值
现在,让我们创建另一个包含文本值的标签:
If(
Value(BMI.Text) > 30,
"Obese",
Value(BMI.Text) >= 24.5,
"Overweight",
Value(BMI.Text) > 18.5,
"Normal",
Value(BMI.Text) < 18.5,
"underweight"
)
注意条件的顺序。如果您以另一种方式执行,您将收到Normal对于所有大于18.5的值
这是因为在If
函数中,第一个条件求值为true会停止函数的执行。.
为什么现有的解决方案不起作用
我可以看到现有代码的一些问题。如果你按照上面的步骤去做,大多数错误都很容易被发现,但我认为把它们指出来可能会更好:
- 不支持从文本到数字的转换
- 不正确使用多条件
If
- 数字值与描述值混用
显示混合值的含义。这里您将描述性值保存到变量:
Set(VarResult,If(tx1.Text/(tx2.Text^2)*703)=<18.5,"underweight")
然后你试着将它与number value进行比较:
if(VarResult>18.5,"Normal")