所以我正在尝试动态计算将在给定消息长度内发送的SMS消息数。 SMS消息被分成160个字节(字符)块。我使用MOD 160< = 1,因为我需要考虑添加和减去文本。出于性能原因,我只想在边界附近进行numMsgs计算:0,1,160,161,320,321,......
问题是在msgBody长度为160时,舍入操作的计算结果为2(160/160 = 1 + 0.5向上舍入)。在160 + 1的倍数处,它应该计算到下一个最高整数,因为任何160字节+ 1个字节等于整个附加消息。
我通过使用OR运算符和== 1 OR == 159来完成这项工作。它正确递增和递减,但它只减少160 -1的倍数,这是不正确的。
此外,我可以将IF逻辑放在外部逻辑中,如果MOD评估为0(零),则简单地减1,但这似乎是kludgey,我宁愿学习我可能在我的箭袋中遗漏的模式:)< / p>
if (msgBody.length() % 160 <= 1) {
numMsgs.setText(Math.round(msgBody.length() / 160 + 0.5));
}
答案 0 :(得分:6)
msgBody.length() / 160
是一个除法表达式,双方都是整数 - 所以它将执行整数除法。我怀疑这就是你做错了什么,但说实话并不完全清楚。 (你声称它没有正确评估,但是你还没有给出我们要看的样本输入/输出/预期输出。)
老实说,最简单的方法是这样整理:
numMsgs.setText((msgBody.length() + 159) / 160);
那仍在执行整数除法,但+159表示如果输入 是160的倍数,它将向上舍入。
我建议您可以执行该计算无论的边界 - 但如果与现有值相比没有变化,请确保您实际上没有更新UI。它会非常便宜 - 一个整数加一个整数除法。
答案 1 :(得分:0)
如果有消息,则至少会发送一条短信。 你想要
(length / 160) + (length%160 > 0 ? 1 : 0)
答案 2 :(得分:0)
只需使用正确的公式,使用int
添加和分割即可。 Modulo可能比分裂更慢。但是,我不清楚你期望的结果是什么...... (msgBody.length() + 159) / 160
还不够?