今天在写需求时需要一个提示需要将小写的数字提示时转换为大写的数字,比如
15m,提示时就是十五分钟(m代表分钟)。 本着程序就是将人的思考归纳总结规律,我总结了一个我的读数规律(也不知道是不是对的)。
- 先按照四个一起的原则分块
- 从最左边年起
- 从坐到右的分组以此为
亿万(就考虑这一趟吧) - 每个分组从右->左的第二位(十分位)为
1的话不能读出声,比如15读十五而不是一十五 - 最后一位为0也不读出声
- 0不读出它的单位
- 如果有连续两个0也不读零,毕竟1001不能读成一百零零一
大概就这样了,开干
private String transferSmallNumToBig(String num) {
StringBuilder timeDesc = new StringBuilder();
String[] numUnit = new String[]{"", "万", "亿"};
String[] numInUnit = new String[]{"", "十", "百", "千"};
String[] bigNum = new String[]{"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
// 分成一个一个字符串
char[] chars = num.toCharArray();
// 看看有几组
int group = chars.length / 4;
// 按四个分是不是有剩余的 先搞这部分
int left = chars.length % 4;
for (int j = 0; j < left; j++) {
appendSingleNum(timeDesc, numInUnit, bigNum, chars, left, j);
}
// 防止正好是4位
if (left > 0) {
timeDesc.append(numUnit[group]);
}
int aLeft = left;
for (int i = 0; i < group; i++) {
int aRight = (left + (i + 1) * 4);
for (int j = aLeft; j < aRight; j++) {
appendSingleNum(timeDesc, numInUnit, bigNum, chars, aRight, j);
}
// 每组后边总的单位
timeDesc.append(numUnit[group - i - 1]);
aLeft = aRight;
}
return timeDesc.toString();
}
private void appendSingleNum(StringBuilder timeDesc, String[] numInUnit, String[] bigNum, char[] chars, int right, int j) {
char aChar = chars[j];
// 这个包装类 判断是不是字符、数字啥的都有方法
int numericValue = Character.getNumericValue(aChar);
String bigName = bigNum[numericValue];
String aNumUnit = numInUnit[right - j - 1];
// 如果正好只有两位,十分位为1的话不读
if (j == 0 && numericValue == 1 && right == 2) {
bigName = "";
}
// 如果是最后一位为0的话也不读
if (j == right - 1 && numericValue == 0) {
bigName = "";
}
// 如果是数字0 所有的单位都不读
if (numericValue == 0) {
aNumUnit = "";
}
// 如果有连续的0 这个不读,看后边那个表现
if (numericValue == 0 && (j + 1) < right && Character.getNumericValue(chars[j + 1]) == 0) {
bigName = "";
aNumUnit = "";
}
timeDesc.append(bigName).append(aNumUnit);
}