发短信:手机短信通常a个字就分一页,分页之前在短信之前都要加上(1/n)、(2/n)...,当然啦,这个要加到每页的字数里面。短信放送之前,头部加上“您好:”,结尾要加上“【AB公司】”,这些也当然要加入字数里面,现在请写一方法来显示每条短信的内容。程序的难点在于怎样获取总页数,而且要判断在什么情况下是不能显示所有的信息内容的
package com.fun;
import java.util.Scanner;
public class MessagePaging {
private static final int MaxWordsOnePage = 10;
private static final String prefix = "您好:";
private static final String suffix = "【AB公司】";
private String pageBaseStr = "(%d/%d)";
final int baseLen = 3; // ( / ), the three character
public static void main(String[] args) {
MessagePaging paging = new MessagePaging();
paging.run();
}
private void run() {
System.out.println("please input message:");
Scanner scanner = new Scanner(System.in);
String content;
while ((content = scanner.nextLine()).length() != 0) {
String result = parseMessage(content);
System.out.println("result: " + result);
for(int i = 0; i < result.length(); i+=MaxWordsOnePage){
int max = (i+MaxWordsOnePage) >= result.length() ? (result.length()) : (i + MaxWordsOnePage);
String str = result.substring(i, max);
System.out.println(i + ":" + str + ",len:" + str.length());
}
}
System.out.println("finish");
}
public String parseMessage(String content) {
StringBuffer sb = new StringBuffer(content);
insertPrefix(sb);
appendSuffix(sb);
if (!hasNextPage(sb)) {
return sb.toString();
}
int page = 1;
int totalPage = getTotalPage(sb.length());
checkInvalidTotalPage(totalPage,sb.length());
while (page <= totalPage) {
insertPageMessage(sb, page, totalPage); //String pageContent =
// System.out.println(pageContent);
++page;
}
return sb.toString();
}
private void checkInvalidTotalPage(int totalPage, int contentLength) {
if (totalPage < 2) {
System.out.println("totalPage " + totalPage + " less than 2");
System.exit(0);
}
String pageMes = String.format(pageBaseStr, totalPage, totalPage);
if (pageMes.length() >= MaxWordsOnePage) {
System.out.println("page message:" + pageMes
+ " is no longer than max words in one page len:"
+ MaxWordsOnePage);
System.exit(0);
}
}
private int getTotalPage(final int contentLength) {
int total = calculateMinTotal(contentLength);
while (calculateTotal(contentLength, total) != total) {
++total;
checkInvalidTotalPage(total,contentLength);
}
return total;
}
private int calculateMinTotal(int contentLength){
int tmpTotalPage = contentLength / MaxWordsOnePage + 1;
int lowLen = baseLen + 2 * getDigits(tmpTotalPage);
return (contentLength + tmpTotalPage*lowLen)/MaxWordsOnePage;
}
private int calculateTotal(int contentLength, int total) {
int totalLength = contentLength + getTotalPageLen(total);
int addOne = ((totalLength % MaxWordsOnePage) == 0 ? 0 : 1);
return totalLength / MaxWordsOnePage + addOne;
}
private int getTotalPageLen(int total) {
int lowLen = baseLen + 1 + getDigits(total);
int highLen = baseLen + 2 * getDigits(total);
int sumLen = 0;
for (int i = 1; lowLen <= highLen; ++i) {
sumLen += lowLen * getLenCount(total, i);
++lowLen;
}
return sumLen;
}
private int getLenCount(int total, int i) {
int low = (int) Math.pow(10, i - 1);
int high = (int) Math.pow(10, i) - 1;
if (total >= low && total <= high) {
return total - low + 1;
}
return 9 * low;
}
// 获取数字的位数
private int getDigits(int total) {
int count = 0;
while (total != 0) {
total /= 10;
count++;
}
return count;
}
private String insertPageMessage(StringBuffer sb, int page, int totalPage) {
String pageMes = String.format(pageBaseStr, page, totalPage);
sb.insert((page - 1) * MaxWordsOnePage, pageMes);
int max = page * MaxWordsOnePage >= sb.length() ? sb.length()
: (page * MaxWordsOnePage);
return sb.substring((page - 1) * MaxWordsOnePage, max);
}
private boolean hasNextPage(StringBuffer sb) {
return sb.length() > MaxWordsOnePage;
}
private StringBuffer insertPrefix(StringBuffer content) {
return content.insert(0, prefix);
}
private StringBuffer appendSuffix(StringBuffer content) {
return content.append(suffix);
}
}