【发布时间】:2018-12-03 01:44:36
【问题描述】:
我正在用 JavaFX8 开发一个 SMS 发送应用程序。 我需要帮助来调整我的短信计数器功能。
一些背景信息:
一条短信可以包含 160 个字符。如果超过 160 个字符,则它变为多部分 SMS。所以第二条短信可以包含 146 个字符,第三条短信可以包含 153 个字符。从第三条短信开始,每条短信可以包含 153 个字符。
所以它会像 160 -> 146 -> 153 -> 153 -> 153 ...
现在我想从 160 倒数到 0,然后从 146 倒数到 0,然后从 153 倒数到 0。
这是我目前所拥有的:
smsComposeArea.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
//Replace all multiple whitspaces with one whitespace
smsComposeArea.setText(smsComposeArea.getText().replaceAll("[^\\S\\r|\\n|\\r\\n]+", " "));
//GSM 03.38 Extended charset ^{}\[~]|€ take up 2 characters - count them as 2 chars. Replace multiple tabs, newlines, whitespaces with one.
int charCount = smsComposeArea.getText().replaceAll("[\\^{}\\\\\\[~\\]|€]{1}", "$0$0").replaceAll("(\\r|\\n|\\r\\n|\\s)+", " ").length();
int countDown;
if(smsComposeArea.getText() == null && smsComposeArea.getText().trim().isEmpty()) {
lblCharCounter.setText("160");
}
else if(charCount >= 1 && charCount <= 160) {
countDown = 160 - charCount;
lblCharCounter.setText(Integer.toString(countDown));
}
else if(charCount >= 160 && charCount <= 306) {
countDown = 146 - (charCount - 160);
lblCharCounter.setText(String.format("2 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 306 && charCount <= 459) {
countDown = 153 - (charCount - 306);
lblCharCounter.setText(String.format("3 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 459 && charCount <= 612) {
countDown = 153 - (charCount - 459);
lblCharCounter.setText(String.format("4 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 612 && charCount <= 765) {
countDown = 153 - (charCount - 612);
lblCharCounter.setText(String.format("5 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 765 && charCount <= 918) {
countDown = 153 - (charCount - 765);
lblCharCounter.setText(String.format("6 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 918 && charCount <= 1071) {
countDown = 153 - (charCount - 918);
lblCharCounter.setText(String.format("7 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 1071 && charCount <= 1224) {
countDown = 153 - (charCount - 1071);
lblCharCounter.setText(String.format("8 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 1224 && charCount <= 1377) {
countDown = 153 - (charCount - 1224);
lblCharCounter.setText(String.format("9 SMS %s", Integer.toString(countDown)));
}
else if(charCount >= 1377 && charCount <= 1530) {
countDown = 153 - (charCount - 1377);
lblCharCounter.setText(String.format("10 SMS %s", Integer.toString(countDown)));
}
}
);
它按预期工作,但我认为应该有更复杂或动态的方式来显示倒计时。在我看来,IF 语句太多了。
感谢任何帮助!
【问题讨论】:
-
那应该是 GSM 吗?因为如果是这样,它要么是一条 160 bytes 的消息,要么包括第一个消息部分在内的每个消息部分都变成 154 bytes,因为它们都有一个等长的 6 字节 UDH。或 153 表示扩展 ID UDH。
-
我从这里举了一个如何计算短信长度的例子:dashboard.messente.com/sms/calculator
-
嗯,他们说的和我刚才说的一样。
标签: java string javafx sms countdown